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 seafloat
,double
olong 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 seafloat
,double
olong 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!