Использование gcc 4.9
я обнаружил, что типы, созданные с типом буквального для комплексных чисел не являются такими же, как при создании обычными средствами, а именно:TypeId (комплекс <double> (0.0,1.0)) = TypeId (1.0i)
typeid(complex<double>(0.0,1.0)) != typeid(1.0i)
- Я делаю ошибку здесь?
- Является ли это ошибкой компилятора или стандартным поведением?
- Если предполагаемое стандартное поведение: в чем причина?
Добавление недостающего MCVE
#include <complex>
using std::complex;
using namespace std::literals::complex_literals;
#include <iostream>
using std::cout;
using std::endl;
#include <typeinfo>
int main(int argc, char* argv[]) {
if (typeid(complex<double>(0.0, 1.0)) == typeid(1.0i))
cout << "types are same as expected" << endl;
else
cout << "types are unexpectedly not the same" << endl;
cout << 1.0i*1.0i << endl;
cout << complex<double>(0.0, 1.0)*complex<double>(0.0, 1.0) << endl;
}
Compile инструкции:
g++ -std=gnu++14 complex.cpp -o complex.exe
Выход:
types are unexpectedly not the same
1
(-1,0)
Интересно, что буквальное не даже, кажется, правильное мнимое число. (Я уверен, что я с видом что-то ...)
Любой шанс, который вы можете поместить в исходный список, который фактически компилируется? Я * думаю * вы используете 'std :: complex', который отличается от '_Complex', gnu-extension для мнимых констант, но без MCVE его жесткое высказывание * что * вы на самом деле делаете. –
WhozCraig
Спасибо за обновление. да, они разные. Один раз из стандартной библиотеки, другой - из расширения компилятора. – WhozCraig
[Невозможно воспроизвести проблему в C++ 14] (http://coliru.stacked-crooked.com/a/1fbd46340ab9b14e) @WhozCraig «i» является (также?) Буквальным суффиксом в C++ 14. В режиме C++ 11 gcc, вероятно, использует [это расширение] (https://gcc.gnu.org/onlinedocs/gcc/Complex.html) – dyp