return und auto deducte std :: initializer_list

8

Im Folgenden:

%Vor%

Warum ist es nicht möglich, den Typ von std :: initializer_list zurückzugeben und automatisch abzuleiten?

    
a.lasram 29.06.2013, 20:02
quelle

1 Antwort

7

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%     
Andy Prowl 29.06.2013, 20:06
quelle

Tags und Links