Вопрос по c++, std, math, complex-numbers, stl – Почему abs (complex <int>) всегда возвращает ноль?

17

Следующий код с отпечатками VS20100вопреки моим ожиданиям:

#include <complex>
#include <iostream>

using namespace std;

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

Работает нормально, когда типdouble.

Ваш Ответ

2   ответа
6

200.

Однако в разделе 26.2.2 стандарта C ++ ISO:

The effect of instantiating the template complex for any type other than float, double or long double is unspecified.

Таким образом, ваша среда сборки демонстрирует неопределенное поведение дляcomplex<int>, что не соответствует стандарту.

Какtemplatetypedef указал,компилятор ide99 C99 (GCC 4.3.4) отказывается компилировать его полностью.

Это & APOS; s4.5.1, на самом деле.
@DeadMG - версия, используемая вtemplatetypedefпример 4.3.4, для C99. Ваша ссылка использует C ++ 0x версии 4.5.1, см.this page
23

The effect of instantiating the template complex for any type other than float, double or long double is unspecified.

Другими словами, компилятор может делать все, что захочет, когда вы создаете экземплярcomplex<int>, Тот факт, что вы получаете 0 здесь, является совершенно четко определенным поведением с точки зрения языка.

Для сравнения - наверсия gcc от ideoneэтот код даже не компилируется. Это еще один совершенно приемлемый вариант.

Надеюсь это поможет!

Спасибо за ваш ответ. Возвращение 0, 200 или 42, когда поведение не определено, может действительно соответствовать стандарту, но, безусловно, это довольно ловушка для случайного программиста, такого как я. Artium
Технически, это именно то, чтоunspecified behavior значит - на них нет бремени делать что-либо вообще, вплоть до случайного выполнения того, что вы ожидали, до тех пор, пока это соответствует этому.
@ PaulManta: Да, наверное. Я понятия не имею, почему это так.
@Artium: есть только две ловушки: одна, вы не правильно прочитали спецификацию, и вторая, компилятор не выдал ошибку, которую он должен был сделать.
Я даже не могу использовать свой собственный тип действительного числа? Это разочаровывает.

Похожие вопросы