2012-06-19 8 views
16

Il seguente codice con VS2010 stampa 0, contrariamente alle mie aspettative:Perché abs (complesso <int>) restituisce sempre zero?

#include <complex> 
#include <iostream> 

using namespace std; 

int main(void) 
{ 
    complex<int> z(20, 200); 
    cout << abs<int>(z) << endl; 
    return 0; 
} 

Funziona benissimo quando il tipo è double.

risposta

23

Secondo le specifiche ISO C++, § 26,2/2:

L'effetto di istanziare modello complex per qualsiasi tipo diverso da float, double o long double è specificato.

In altre parole, il compilatore può fare tutto ciò che desidera quando si crea un'istanza complex<int>. Il fatto che stai ricevendo 0 qui è un comportamento perfettamente ben definito dal punto di vista della lingua.

Per un confronto - su ideone's version of gcc, questo codice non viene nemmeno compilato. Questa è un'altra opzione perfettamente valida.

Spero che questo aiuti!

+0

Huh, non mi è nemmeno permesso usare il mio tipo di numero reale? Questo è deludente. –

+0

@ PaulManta- Sì, immagino di no. Non ho idea del perché questo sia. – templatetypedef

+1

Grazie per la risposta. Restituire 0, 200 o 42 quando il comportamento non è specificato potrebbe essere effettivamente secondo uno standard, ma sicuramente è piuttosto una trappola per il programmatore casuale come me. – Artium

6

Su MinGW 4.6.2 stampa 200.

Tuttavia, nella sezione standard C++ ISO 26.2.2:

L'effetto di istanziare modello complex per qualsiasi tipo diverso da float, double o long double è specificato.

Quindi l'ambiente di costruzione presenta un comportamento non definito per complex<int>, che non è conforme allo standard.

Come indicato da templatetypedef, ideone's C99 compiler (GCC 4.3.4) rifiuta di compilarlo del tutto.

+0

È [4.5.1] (http://ideone.com/pLiug), in realtà. – Puppy

+0

@DeadMG - La versione utilizzata nell'esempio di 'templatetypedef' è 4.3.4, per C99. Il tuo link utilizza C++ 0x, che è la versione 4.5.1, vedi [questa pagina] (http://ideone.com/samples#sample_lang_44) – Unsigned

Problemi correlati