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)return
sentezleme; }
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>
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 }(); '? –
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. –