Bene, perché lo standard dice così, e perché un rinforzato-init-list non è un'espressione. Per il paragrafo 5.1.2/4 del C++ 11 standard:
[...] Se un lambda-espressione non include una trailing-ritorno-tipo, è come se la posteriore-ritorno-tipo denota il tipo seguente:
- se il composto -affermazione è della forma
{
attributo-specificatore-seq (opt)return
espressione; }
il tipo dell'espressione restituito dopo Ivalue-to-rvalue conversione (4.1), da matrice a pointer conversione (4.2), e conversione da funzione a puntatore (4.3);
- altrimenti, void
.
È possibile che questo rende chiaro che il tipo di ritorno sarà dedotto di essere qualcos'altro poi void
se e solo se la dichiarazione return
è seguito da un espressione, e un rinforzato-init-list non è di per sé un'espressione - non ha un tipo e non produce un valore. È solo un costrutto linguistico che può essere utilizzato nel contesto dell'inizializzazione.
Quanto sopra fornisce anche un esempio:
[Esempio:
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)
- esempio fine]
Infine, se la domanda è:
"Perché è stata introdotta una norma speciale per dedurre il tipo di un auto
variabili inizializzata da a-init-list rinforzato, mentre una regola simile era non introdotto per dedurre il tipo di ritorno di un lambda quando return
è seguito da un rinforzato-init-list? "
Quindi la domanda non è costruttiva.Si noti inoltre, che tipo di deduzione per i modelli non funziona con imbracciò-init-list sia:
template<typename T>
void foo(T);
foo({1, 2}); // ERROR! T is NOT deduced to be std::initializer_list<int>
fonte
2013-06-29 20:06:57
Hai provato 'auto z = []() -> Sistema {return {0}; }(); '? –
Nota che ** non ** vuoi che deduca comunque 'initializer_list', perché i valori nella lista hanno una durata del lambda - non sono estesi da un ritorno di funzione. Vengono distrutti prima di poter usare 'y' o' z'. [Ulteriori informazioni] (http://stackoverflow.com/questions/15286450/lifetime-of-a-stdinitializer-list-return-value). La linea 'y' causa UB. –