Почему abs (complex <int>) всегда возвращает ноль?
Следующий код с VS2010 печатает 0
, вопреки моим ожиданиям:
#include <complex>
#include <iostream>
using namespace std;
int main(void)
{
complex<int> z(20, 200);
cout << abs<int>(z) << endl;
return 0;
}
Он отлично работает, когда тип double
.
Ответы
Ответ 1
В соответствии со спецификацией ISO С++, раздел 26.2/2:
Эффект создания шаблона complex
для любого типа, отличного от float
, double
или long double
, не указан.
Другими словами, компилятор может делать все, что захочет, при создании экземпляра complex<int>
. Тот факт, что вы получаете здесь 0, является совершенно четко определенным поведением с точки зрения языка.
Для сравнения - на идеонной версии gcc этот код даже не компилируется. Это еще один отличный вариант.
Надеюсь, это поможет!
Ответ 2
В MinGW 4.6.2 он печатает 200
.
Однако в стандартном разделе С++ ISO 26.2.2:
Эффект создания шаблона complex
для любого типа, отличного от float
, double
или long double
, не указан.
Итак, ваша среда сборки демонстрирует поведение undefined для complex<int>
, что не соответствует стандарту.
Как отмечал templatetypedef
, ideone C99 компилятор (GCC 4.3.4) отказывается компилировать его вообще.