2013-08-24 43 views
2

我正在学习新的C++ 11功能 - 统一初始化。写小程序: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; 
} 

但是,我得到意想不到的结果0 0。换句话说,一切都被初始化为零。这可能发生的唯一方法:1.调用隐式默认构造函数,或2.初始化没有正确完成。 (3.编译器???)

为什么我得到意想不到的结果?在C++ 11中使用统一初始化的构造函数语法是否有任何更改?

编辑:采用最新的英特尔编译:

1>------ Rebuild All started: Project: Unif_Init (Intel C++ 13.0), Configuration: Debug Win32 ------ 
1> Source.cpp 
1> xilink: executing 'link' 
1> xilink: executing 'link' 
1> Unif_Init.vcxproj -> C:\Users\alex\documents\visual studio 2012\Projects\Unif_Init\Debug\Unif_Init.exe 
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ========== 
+1

什么编译器?我无法用gcc重现。 –

+0

@JesseGood英特尔C++编译器13 – newprint

回答

3

这是在编译器中的错误。 C{}调用默认构造函数来创建一个用于复制初始化对象的临时对象cC(int a = 1, int b = 2)显然是默认的,所以它应该使用它。将初始化顺序切换到在类中声明的顺序是否有帮助(可能不是,但只是猜测)?看起来intel编译器并没有将默认参数作为默认参数来考虑。

C(int a = 1, int b = 2) : n{0,1,2,3,4}, a_{a}, b_{b} {}; 
+0

试过你的版本,同样的事情。 最重要的是,我只是尝试了'int * pi = new int [4] {1,2,3,4};'并得到错误'1> Source.cpp(18):error:expected a“;” 1> \t int * pi = new int [4] {1,2,3,4}; // C++ 09'因此,看起来像英特尔编译器并不完全是C++ 11的补充,并且有一些错误。否则,它是最好的编译器。 – newprint

+1

@JesseGood:“复制 - 初始化对象”它不复制 - 初始化对象。 –

+0

@NicolBolas:AFAIK,代码会调用默认构造函数来创建一个临时对象,然后调用移动对象将临时对象移动到'c'。我认为这被称为“复制初始化”,我错过了什么? –

相关问题