小编rol*_*and的帖子

typeid(complex <double>(0.0,1.0))!= typeid(1.0i)

使用gcc 4.9我发现用复数形式的文字生成的类型与通过常规方法创建的类型不同,即:

typeid(complex<double>(0.0,1.0)) != typeid(1.0i)
Run Code Online (Sandbox Code Playgroud)
  1. 我在这里弄错了吗?
  2. 这是编译器错误还是预期的标准行为?
  3. 如果是预期的标准行为:背后的理由是什么?

添加缺少的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;
}
Run Code Online (Sandbox Code Playgroud)

编译说明:

g++ -std=gnu++14 complex.cpp -o complex.exe
Run Code Online (Sandbox Code Playgroud)

输出:

types are unexpectedly …
Run Code Online (Sandbox Code Playgroud)

c++ complex-numbers user-defined-literals c++11

12
推荐指数
1
解决办法
508
查看次数