A partir de C++11
, se agregaron casos especiales al conjunto de funciones de poder (y otros). C++11 [c.math] /11
afirma, después de enumerar todas las float/double/long double
sobrecargas (mi énfasis, y parafraseado):
Además, habrá sobrecargas adicionales suficientes para asegurar que, si cualquier argumento correspondiente a un double
parámetro tiene un tipo double
o un tipo entero, entonces todos los argumentos correspondientes a los double
parámetros sean efectivamente convertidos double
.
Entonces, básicamente, los parámetros enteros se actualizarán a dobles para realizar la operación.
Antes de C++11
(que fue cuando se hizo su pregunta), no existían sobrecargas de enteros.
Dado que no estaba estrechamente asociado con los creadores C
ni C++
en los días de su creación (aunque soy bastante mayor), ni formaba parte de los comités ANSI / ISO que crearon los estándares, esta es necesariamente una opinión de mi parte. Me gustaría pensar que está informado opinión pero, como mi esposa le dirá (con frecuencia y sin mucha motivación), me he equivocado antes :-)
Sigue la suposición, por lo que vale.
Yo sospecho que la razón original de la pre-ANSI C
no tienen esta característica se debe a que era totalmente innecesario. Primero, ya había una manera perfectamente buena de hacer potencias enteras (con dobles y luego simplemente convertir de nuevo a un número entero, verificando el desbordamiento y subdesbordamiento de enteros antes de convertir).
En segundo lugar, otra cosa que debe recordar es que la intención original de C
era como lenguaje de programación de sistemas , y es cuestionable si el punto flotante es deseable en ese ámbito.
Dado que uno de sus casos de uso inicial fue codificar UNIX, el punto flotante habría sido casi inútil. BCPL, en el que se basaba C, tampoco tenía uso de poderes (no tenía punto flotante en absoluto, de memoria).
Aparte, un operador de energía integral probablemente habría sido un operador binario en lugar de una llamada a la biblioteca. No agrega dos enteros con x = add (y, z)
pero con x = y + z
- parte del lenguaje propiamente dicho lugar de la biblioteca.
En tercer lugar, dado que la implementación del poder integral es relativamente trivial, es casi seguro que los desarrolladores del lenguaje utilizarían mejor su tiempo proporcionando cosas más útiles (vea los comentarios a continuación sobre el costo de oportunidad).
Eso también es relevante para el original C++
. Dado que la implementación original era efectivamente solo un traductor que producía C
código, se transfirieron muchos de los atributos de C
. Su intención original era C-con-clases, no C-con-clases-más-un-poco-de-cosas-matemáticas-adicionales.
En cuanto a por qué nunca se agregó a los estándares antes C++11
, debe recordar que los organismos que establecen los estándares tienen pautas específicas a seguir. Por ejemplo, a ANSI C
se le asignó específicamente la tarea de codificar la práctica existente, no de crear un nuevo idioma. De lo contrario, podrían haberse vuelto locos y habernos dado a Ada :-)
Las versiones posteriores de ese estándar también tienen pautas específicas y se pueden encontrar en los documentos de justificación (la justificación de por qué el comité tomó ciertas decisiones, no la justificación del lenguaje en sí).
Por ejemplo, el C99
documento de justificación lleva adelante específicamente dos de los C89
principios rectores que limitan lo que se puede agregar:
- Mantenga el lenguaje pequeño y simple.
- Proporcione solo una forma de realizar una operación.
Las pautas (no necesariamente las específicas ) se establecen para los grupos de trabajo individuales y, por lo tanto, también limitan los C++
comités (y todos los demás grupos ISO).
Además, los organismos que establecen los estándares se dan cuenta de que existe un costo de oportunidad (un término económico que significa lo que tiene que renunciar para tomar una decisión) para cada decisión que toman. Por ejemplo, el costo de oportunidad de comprar esa súper máquina de juego de $ 10,000 son relaciones cordiales (o probablemente todas las relaciones) con su otra mitad durante aproximadamente seis meses.
Eric Gunnerson explica esto bien con su explicación de 100 puntos sobre por qué las cosas no siempre se agregan a los productos de Microsoft, básicamente una característica comienza con 100 puntos en el pozo, por lo que tiene que agregar bastante valor para ser considerada.
En otras palabras, ¿preferiría tener un operador de energía integral (que, honestamente, cualquier codificador medio decente podría activar en diez minutos) o agregar múltiples subprocesos al estándar? Para mí, preferiría tener lo último y no tener que andar con las diferentes implementaciones en UNIX y Windows.
También me gustaría ver miles y miles de colecciones de la biblioteca estándar (hashes, btrees, árboles rojo-negro, diccionario, mapas arbitrarios, etc.) pero, como dice la justificación:
Un estándar es un tratado entre el implementador y el programador.
Y la cantidad de implementadores en los organismos de estándares supera con creces la cantidad de programadores (o al menos los programadores que no entienden el costo de oportunidad). Si se añadieran todas esas cosas, el siguiente estándar C++
seríaC++215x
y probablemente sería completamente implementado por los desarrolladores de compiladores trescientos años después de eso.
De todos modos, esos son mis pensamientos (bastante voluminosos) al respecto. Si solo los votos se repartieran en base a la cantidad en lugar de la calidad, pronto dejaría a todos los demás fuera del agua. Gracias por su atención :-)