C++ C+;中的统一初始化和默认构造函数参数+;11
我正在学习新的C++11特性-统一初始化。编写了一个小程序:C++ C+;中的统一初始化和默认构造函数参数+;11,c++,c++11,uniform-initialization,C++,C++11,Uniform Initialization,我正在学习新的C++11特性-统一初始化。编写了一个小程序: #include <iostream> using namespace std; class C { public: C(int a = 1, int b = 2) : a_{a}, b_{b}, n{0,1,2,3,4} {}; int n[5]; int a_,b_; }; int main() { C c = C{}; // should call C(int a = 1, i
#include <iostream>
using namespace std;
class C {
public:
C(int a = 1, int b = 2) : a_{a}, b_{b}, n{0,1,2,3,4} {};
int n[5];
int a_,b_;
};
int main()
{
C c = C{}; // should call C(int a = 1, int b = 2) with default arg.
cout << c.a_ << " " << c.b_ << endl;
return 0;
}
这是编译器中的一个bug
C{}
调用默认构造函数来创建一个临时构造函数,用于复制和初始化对象C
C(inta=1,intb=2)
显然是一个默认值,所以它应该使用它。将初始化顺序切换到类中声明的顺序是否有帮助(可能没有,但只是猜测)?英特尔编译器似乎没有考虑将带有默认参数的ctor作为默认参数
C(int a = 1, int b = 2) : n{0,1,2,3,4}, a_{a}, b_{b} {};
什么编译器?我不能用GCC复制。@ JeSeGoLoad英特尔C++编译器13尝试过你的版本,同样的事情。除此之外,我还尝试了
int*pi=newint[4]{1,2,3,4}代码>并得到错误1>Source.cpp(18):错误:应为a“;“1>int*pi=newint[4]{1,2,3,4}//C++09
所以,看起来英特尔编译器并不是完全对C++11的恭维,并且有一些bug。否则,它就是最好的编译器。@JesseGood:“复制初始化对象”它不会复制初始化对象。@NicolBolas:AFAIK,代码会调用默认构造函数来创建一个临时对象,然后调用move ctor将临时对象移动到c
。我以为这就是所谓的复制初始化,我遗漏了什么?@JesseGood:你描述的是复制初始化,但它不是这样做的。它执行直接列表初始化。没有抄袭。@Nicolas:我想这可能是因为我的措词不好。是的,C{}
是直接列表初始化,但是我说的是行C=C{}
,其中,C{}
初始化一个临时文件,然后用于复制initializeC
(我已经更新了措辞)。
C(int a = 1, int b = 2) : n{0,1,2,3,4}, a_{a}, b_{b} {};