2013-06-11 11 views
9

C++ 11'de nesneler için iyi bir biçimsel başlatma sözdizimimiz var. Neden nesne olmayan türlerini de başlatmayı da kapsamaz?Neden tek tip başlatma sözdizimi yalnızca nesneler için uygulanır?

Bunun için sözdizimsel bir belirsizlik var mı, yoksa sadece sorduğum aptalca bir soru mu?

Örnek:

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

daha kullanışlı bir örnek:

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_; 
}; 

Başka bir:

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

Tahminimce, dilin tasarımcıları mevcut s1_ (x1) sözdiziminin oldukça yeterli olduğuna karar verdiler. – dasblinkenlight

+0

@dasblinkenlight açıkça açık değil (MVP'yi düşünün). –

+0

Son örneğiniz yasa dışı. 'void' eksik bir nesne türüdür; "void" türünde nesneler oluşturmanın yolu yoktur. – Angew

cevap

0

C++ başlatma kuralları oldukça karmaşıktır. Bunlar, standardın (fıkra) 8'in ikinci yarısında açıklanmıştır. Sıfır başlatma, doğrudan başlatma, değer-başlatma, kopyalama-başlatma, sadece birkaç isim için liste-başlatma ve her biri bağlam (bildirim, parametre, geri dönüş, atma, üye başlatıcı, vb.) Bağlı olarak farklı etkileşimler olabilir.), bağlanacak olan yazının özellikleri ve giriş başlatma ifadesi veya parantez içinde init listesi. Dil tasarımcıları, C ile yapabileceklerini kısıtlayan C++ ve daha eski sürümleriyle neredeyse geriye dönük olarak uyumlu hale getirmeyi amaçlıyorlar. Başlatma kurallarındaki değişikliklerin sonuçları üzerinde spekülasyon yapmak biraz araştırma gerektiriyor ve değişiklikler çok sayıda istenmeyen köşe durumu oluşturabilir. İlgilendiğiniz takdirde, standardı incelemenizi ve tasarladığınız önerilen bir değişikliğin sonuçları üzerinde çalışmayı denemenizi öneririz.

İlgili konular