STD ::复杂的初始化问题

std::complex initilalisation issue

本文关键字:问题 初始化 复杂 STD      更新时间:2023-10-16

考虑以下代码

#include <complex>
#include <iostream>
int main(int argc, char **argv)
{
    std::complex<double> a = 1+1i;
    std::cout<<"a ="<<a<<"n";
    return 0;
}

当我使用Apple LLVM版本8.0.0(Clang-800.0.42.1)编译时,我获得的输出是

a =(1,0)

有人可以解释为什么想象中的部分以零而初始化?

1 + 1i使用的是(GCC)扩展名,该扩展名创建与C99的_Complex int类型相似/等效的类型。该类型可转换为intdouble之类的真实类型。std::complex_Complex不兼容,它没有任何构造函数可以从_Complex(*)创建std::complex。但是std::complex<T>确实有一个需要T的构造函数。这触发了上述转换_Complex-> T-> std::complex<T>

因此,OP中的代码等效于:

#include <complex>
#include <iostream>
int main()
{
    double d = 1+1i;
    std::complex<double> a = d;
    std::cout<<"a ="<<a<<"n";
    return 0;
}

1 + 1i的假想部分在转换为double中删除。


为了防止这种惊喜,请尝试使用警告和-pedantic进行编译。这个示例似乎是Clang实际添加-pedantic标志的额外警告的少数地方之一(对于GCC,-pedantic在许多情况下更改了警告输出):

 prog.cc:6:19:警告:虚构常数是GNU扩展[-wgnu-imaginary-constant]    double d = 1 1i;

(*)IIRC,std::complex在C 98中引入,而_Complex在C99中引入。