sirve que para libreria library fabs ejemplo dev comando abs c++ math stl std complex-numbers

c++ - que - ¿Por qué abs(complex<int>) siempre devuelve cero?



fabs c++ ejemplo (2)

El siguiente código con VS2010 imprime 0 , contrariamente a mis expectativas:

#include <complex> #include <iostream> using namespace std; int main(void) { complex<int> z(20, 200); cout << abs<int>(z) << endl; return 0; }

Funciona bien cuando el tipo es double .


En MinGW 4.6.2 imprime 200 .

Sin embargo, en la sección 26.2.2 de la norma C ++ ISO:

El efecto de crear una instancia del complex plantillas para cualquier tipo que no sea float , double o long double no se especifica.

Por lo tanto, su entorno de compilación está mostrando un comportamiento indefinido para el complex<int> , que no está en contra del estándar.

Como señala templatetypedef , el compilador C99 de ideone (GCC 4.3.4) se niega a compilarlo por completo.


Según la especificación ISO de C ++, §26.2 / 2:

El efecto de crear una instancia del complex plantillas para cualquier tipo que no sea float , double o long double no se especifica.

En otras palabras, el compilador puede hacer lo que quiera cuando crea complex<int> instancia de complex<int> . El hecho de que esté obteniendo un 0 aquí es un comportamiento perfectamente definido desde una perspectiva lingüística.

Para una comparación, en la versión de ideone de gcc , este código ni siquiera se compila. Esa es otra opción perfectamente válida.

¡Espero que esto ayude!