Nun, weil der Standard das sagt, und weil eine brained-init-Liste kein Ausdruck ist. Gemäß Absatz 5.1.2 / 4 des C ++ 11 Standards:
[...] Wenn Ein lambda-Ausdruck enthält keinen trailing-return-type . Es ist, als ob der trailing-return-type den Wert " folgender Typ:
- wenn die zusammengesetzte Anweisung die Form
hat
{
attributspezifizierer-seq (opt)return
ausdruck; }
Der Typ des zurückgegebenen Ausdrucks nach lvalue-to-rvalue-Konvertierung (4.1), Array-to-Pointer-Konvertierung (4.2), und Funktion-Zeiger-Konvertierung (4.3);
- andernfalls
void
.
Das obige macht deutlich, dass der Rückgabetyp so abgeleitet wird, dass er alles andere als void
ist, wenn und nur wenn auf die return
-Anweisung ein Ausdruck und ein folgt braced-init-list ist an sich kein Ausdruck - er hat keinen Typ und liefert keinen Wert. Es ist nur ein Sprachkonstrukt, das im Kontext der Initialisierung verwendet werden kann.
Der obige Absatz enthält auch ein Beispiel:
[ Beispiel :
%Vor%- Ende Beispiel ]
Schließlich, wenn die Frage ist:
" Warum wurde eine spezielle Regel eingeführt, um den Typ einer auto
-Variablen abzuleiten, die aus einer brained-init-Liste initialisiert wurde, während eine ähnliche Regel zur nicht -Einleitung eingeführt wurde Typ eines Lambda wenn auf return
eine brained-init-Liste folgt? "
Dann ist die Frage nicht konstruktiv. Beachten Sie auch, dass Typabzug für Vorlagen nicht mit braced-init-lists funktioniert:
%Vor%