STD ::复杂的初始化问题
std::complex initilalisation issue
考虑以下代码
#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
类型相似/等效的类型。该类型可转换为int
或double
之类的真实类型。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中引入。
相关文章:
- C++转换参数初始化问题
- 运行时C++数组初始化问题
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- C++初始化具有 int 0 问题的unique_ptr
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- 在构造函数 c++ 中初始化属性时出现问题
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- shared_ptr类的向量的向量初始化问题
- public:静态常量字符串声明/初始化问题
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 使用 true 初始化布尔数组时出现问题
- 为什么C++中的大括号初始化可以解决STL容器的初始化问题
- 程序在没有输入的情况下退出,它有基本的,驱动的类属性初始化问题
- C++中构造函数的对象初始化出现问题
- 初始化com对象的问题
- 初始化多个纹理 OpenGL、SDL C++ 时出现问题
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 理解向量初始化时出现问题