2013-08-24 68 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'。我認爲這被稱爲「複製初始化」,我錯過了什麼? –

相關問題