2013-06-11 83 views
9

在C++ 11中,我們爲對象提供了很好的統一初始化語法。爲什麼它沒有擴展到初始化非對象類型呢?爲什麼統一初始化語法僅適用於對象?

是否有任何語法歧義,或者它只是我問的一些愚蠢的問題?

實施例:

struct s{ int k;}; 
s s1{1}; //ok (object initialization) 
s const& s3{3}; //ok (object initialization) 
s& s2{s1}; //error (reference initialization) 

更有用的例子:

struct t{ t(t const& x) : k(x.k){} int k;}; 
struct c 
{ 
    c(t& x1,t& x2) 
    : s1_{x1} //error (reference initialization) 
    , s2_{x2} //ok (object initialization) 
    {} 
t& s1_; 
t s2_; 
}; 

另一種:

template<class T> 
T get() 
{ 
    return T{}; 
} 

//ok (object initialization) 
get<int>(); 
//error (void initialization? I do not know terminology for void() token equivalent) 
get<void>(); 
+0

我的猜測是,該語言的設計者決定現有的's1_(x1)'語法已經足夠了。 – dasblinkenlight

+0

@dasblinkenlight它顯然不是(考慮MVP)。 –

+0

你最後的例子是非法的。 'void'是一個不完整的對象類型;沒有辦法創建「void」類型的對象。 – Angew

回答

0

C++的初始化規則相當複雜。它們在標準的第8章(第8章)的後半部分中描述。有零初始化,直接初始化,值初始化,複製初始化,列表初始化等等,並且每個都可以根據上下文(聲明,參數,返回,拋出,成員初始化等等)具有不同的交互。 ),要綁定的類型的屬性以及輸入初始化表達式或braced-init-list。語言設計者也使得它幾乎向後兼容C和較早版本的C++,這限制了他們可以做什麼。需要進行相當多的研究來推測初始化規則變化的後果,並且更改可能會產生很多意想不到的案例。如果您有興趣,我鼓勵您研究該標準,並嘗試解決您設計的建議更改的含義。