2013-05-28 251 views
1

我無法初始化使用在類初始化一個結構:結構初始化與類成員初始化

struct A 
{ 
    int a{}; 
    int b{}; 
}; 

struct B 
{ 
    int a; 
    int b; 
}; 

int main() 
{ 
    A a; // OK 
    B b{1, 2}; // OK 
    B b2; // OK, but b.a and b.b are undefined 
    A a2{1, 2}; // ERROR! 
} 

下面是我從GCC 4.7.2收到錯誤:

% g++ -std=c++11 test2.cc 
test2.cc: In function ‘int main()’: 
test2.cc:16:11: error: no matching function for call to ‘A::A(<brace-enclosed initializer list>)’ 
test2.cc:16:11: note: candidates are: 
test2.cc:1:8: note: constexpr A::A() 
test2.cc:1:8: note: candidate expects 0 arguments, 2 provided 
test2.cc:1:8: note: constexpr A::A(const A&) 
test2.cc:1:8: note: candidate expects 1 argument, 2 provided 
test2.cc:1:8: note: constexpr A::A(A&&) 
test2.cc:1:8: note: candidate expects 1 argument, 2 provided 

應該按照標準進行這項工作,還是這實際上是非法的?我濫用類內初始值設定項嗎?我認爲新的語法會使它成爲可能,所以我不必爲了初始化而編寫構造函數,但是現在看來,我可能不得不使用舊的機制來避免未初始化結構的可能性。

回答

3

如果任

  • 支架內容相匹配的構造函數(不是你的情況下),或

  • 類是聚集和每個支撐元素的類成員匹配,就只能使用大括號。

然而,一類是聚合如果(C++ 11,8.5.1/1):

它沒有用於非靜態支架 - 或等於-初始化成員

你的班級明確擁有。所以,你也沒有聚合。

要麼寫入合適的構造函數,要麼刪除括號或等於初始值設定項。

+4

我相信這會改變C++ 14。 –