を使用しgcc 4.9
て、複素数の型リテラルで生成された型は、従来の手段で作成された場合と同じではないことがわかりました。
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;
}
コンパイル手順:
g++ -std=gnu++14 complex.cpp -o complex.exe
出力:
types are unexpectedly not the same
1
(-1,0)
興味深いことに、リテラルは適切な虚数ではないようです。(私は何かを見落としていると確信しています...)