Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+;中的统一初始化和默认构造函数参数+;11_C++_C++11_Uniform Initialization - Fatal编程技术网

C++ 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

我正在学习新的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, 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{}
初始化一个临时文件,然后用于复制initialize
C
(我已经更新了措辞)。
C(int a = 1, int b = 2) : n{0,1,2,3,4}, a_{a}, b_{b} {};