[英]Why uniform initialization syntax is applied only for objects?
在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>();
C ++的初始化規則非常復雜。 它們在標准章節(第8節)的后半部分進行了描述。 零初始化,直接初始化,值初始化,復制初始化,列表初始化僅舉幾例,每個都可以根據上下文(聲明,參數,返回,拋出,成員初始化器等)進行不同的交互。 ),要綁定的類型的屬性和輸入初始化表達式或braced-init-list。 語言設計者還將目標與C和舊版本的C ++幾乎向后兼容,這限制了他們可以做的事情。 需要進行一些研究來推測初始化規則更改的后果,並且更改可能會產生許多意外的極端情況。 如果您有興趣,我鼓勵您學習標准並嘗試解決您設計的建議更改的含義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.