Подтвердить что ты не робот

Почему 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.

4b9b3361

Ответ 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) отказывается компилировать его вообще.