2013-06-29 17 views
8

initializer_list: geri dönmek mümkün değildir ve otomatik std tipini anlamak :: initializer_list nedendönüş ve otomatik anlamak std :: aşağıdaki yılında

auto x = {0}; // auto deduction of std::initializer_list<int> 
auto y = []() -> std::initializer_list<int> { return {0}; }(); //explicit 
auto z = []() { return {0}; }(); // won't compile 

?

+0

Eğer 'denedin mi oto z = []() -> Otomatik {return {0};: Ayrıca fark, şablonlar için tip kesinti ya hazırladı-init-listeleri ile çalışmıyor }(); '? –

+1

Not: ** Listede yer alan değerler lambda'nın ömrüne sahip olduğundan, bir işlev döndürme tarafından genişletilmediğinden, * initializer_list'i bile çıkarmasını istemediğinizi unutmayın. Onlar 'y' veya' z' kullanmadan önce imha edilirler. [Daha fazla bilgi] (http://stackoverflow.com/questions/15286450/lifetime-of-a-stdinitializer-list-return-value). 'Y' hattı UB'ye neden olur. –

cevap

7

Eh, Standard öyle diyor ve braced-init-list bir ifade olmadığı için. Paragraf C++ 11 standardın 5.1.2/4 başına:

[...] bir lambda ifade bir arka-dönüş-tip içermez , bu gibi olduğu arka-dönüş tipi aşağıdaki türü temsil eder:

-bileşiği ile ifade formu ise

{.210 öznitelik belirteci seq (opt)returnsentezleme; }

sonra geri ifade tipi lvalue-için-rvalue dönüşüm (4.1), dizi-için-işaretçi Dönüşüm (4.2) ve işlev-işaretçi dönüşümü (4.3);

- aksi halde void.

yukarıda return deyimi bir ifadesi ve hazırladı-init-listesi izler olup olmadığını ve açık olmaması gerekir dönüş tipi başka ardından void şey olmak çıkarılabilir olacağı açıkça yapar kendi içinde bir ifade - bir türü yoktur ve bir değer vermez. Bu, başlatma bağlamında kullanılabilecek bir dil yapısıdır. Soru ise,

Son olarak:

-:

[uç örneği

auto x1 = [](int i){ return i; }; // OK: return type is int 
auto x2 = []{ return { 1, 2 }; }; // error: the return type is void (a 
            // braced-init-list is not an expression) 

Örnek:]

paragraf de bir örnek teşkil

"Benzer bir kural bir lambda dönüş türü deducing için tanıtılan değil iken return bir takip edildiğinde özel bir kural, bir hazırladı-init-listeden başlatıldı bir auto değişkenin türünü deducing için tanıtıldı Neden hazırladı-init-listesi? Daha sonra soru yapıcı değildir.

template<typename T> 
void foo(T); 

foo({1, 2}); // ERROR! T is NOT deduced to be std::initializer_list<int> 
+0

Cevabı için teşekkürler Andy. Otomatik için kesinti yapıldığını ve şablonların aynı kuralları izlediğini, ancak bir karşı örnek verdiğinizi düşündüm. –

+0

@ a.lasram: Çoğu durumda yaparlar, ancak istisnalar vardır. Aslında, ben cevap sonunda işaret ettiğim bence * sadece * istisna -% 100 emin değilim. –

+0

@ Andy Prowl - özür, otomatik olarak aynı durum: foo ({1, 2}) başarısız ama foo > ({1, 2}) geçecekti. –

İlgili konular