簡體   English   中英

為什么統一初始化語法僅適用於對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM