我不明白C++ 11大括號初始化規則是如何在這裏工作的。 有了這個代碼:C++ 11奇怪大括號初始化行爲
struct Position_pod {
int x,y,z;
};
class Position {
public:
Position(int x=0, int y=0, int z=0):x(x),y(y),z(z){}
int x,y,z;
};
struct text_descriptor {
int id;
Position_pod pos;
const int &constNum;
};
struct text_descriptor td[3] = {
{0, {465,223}, 123},
{1, {465,262}, 123},
};
int main()
{
return 0;
}
筆記,該陣列被聲明爲具有3個元素,但僅提供2初始化。
然而,它編譯沒有錯誤,這聽起來很奇怪,因爲最後一個數組元素的引用成員將被初始化。事實上,它具有NULL值:
(gdb) p td[2].constNum
$2 = (const int &) @0x0: <error reading variable>
而現在的 「魔術」:我改變Position_pod到位置
struct text_descriptor {
int id;
Position_pod pos;
const int &constNum;
};
變成這樣:
struct text_descriptor {
int id;
Position pos;
const int &constNum;
};
,現在,它給出了預期的錯誤:
error: uninitialized const member ‘text_descriptor::constNum'
我q問題:爲什麼它在第一種情況下編譯,何時應該給出錯誤(如第二種情況)。 區別在於,Position_pod使用C風格的大括號初始化,而Position使用C++ 11風格的初始化,它調用Position的構造函數。但是,這會如何影響將參考成員未初始化的可能性?
(更新) 編譯: GCC(Ubuntu的4.8.2-19ubuntu1)4.8.2
編譯器版本很重要。 [Clang 3.5和GCC 4.9.2](http://coliru.stacked-crooked.com/a/4669040f8cc1bd3e)不要編譯這個。 – 2015-02-09 11:44:26
看起來像一個編譯器錯誤。我可以在GCC 4.8和更早的版本上重現,因此看起來它已經在4.9版本中得到了修復。 – 2015-02-09 11:49:42
MSVC 2013不會編譯。 – Drop 2015-02-09 11:54:29