2016-12-15 5 views
12
int main() 
{ 
    auto l = [x = 10]() -> decltype(x) {}; 
} 

Ist das ein Fehler oder gibt es im Standard etwas, das explizit verhindert, dass Objekte, die mit der verallgemeinerten C++ 14 -Syntax erfasst wurden, in dem nachfolgenden Rückgabetyp des Lambda verwendet werden?


Beachten Sie, dass beide Compiler glücklich sind mit nicht verallgemeinert Captures:

int main() 
{ 
    int x = 10; 
    auto l = [x]() -> decltype(x) { return 0; }; 
} 
+3

'int' war ein Standard Rückgabetyp, wird gcc irgendeinen anderen Typ herleiten? – alexeykuzmin0

+0

@ alexeykuzmin0: guter Fang. [Es leitet immer "int"] (http://melpon.org/wandbox/permlink/OivD8IYUT3Jq0720) ... Aktualisieren der Frage –

+2

Es gibt einige seltsame Fälle mit 'decltype' und lambdas, z. [this] (https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/6-VL5bzK6Ik). – TartanLlama

Antwort

8

TL; DR: Compiler wie erwartet verhalten.

Der Standard definiert Lambda-Semantik wie folgt [expr.prim.lambda, Abschnitt 1]:

lambda-expression:

lambda-introducer lambda-declarator_opt compound-statement 

Hier Verbindung-Anweisung ist nur der Körper von Lambda zwischen {}, denn alles andere enthalten ist in Lambda-declarator:

lambda-declarator:

(parameter-declaration-clause) decl-specifier-seq_opt 
     exception-specification_opt attribute-specifier-seq_opt trailing-return-type_opt 

auch in Abschnitt 12 des gleichen Kapitels, wird gesagt, dass

An init-capture behaves as if it declares and explicitly captures a variable of the form “auto init-capture ;” whose declarative region is the lambda-expression’s compound-statement, except that:

(12.1) — if the capture is by copy (see below), the non-static data member declared for the capture and the variable are treated as two different ways of referring to the same object, which has the lifetime of the non-static data member, and no additional copy and destruction is performed, and

(12.2) — if the capture is by reference, the variable’s lifetime ends when the closure object’s lifetime ends.

Also, in Ihrem ersten Beispiel, Variable x Bereich ist der Lambda-Körper nur, nicht einschließlich der decltype Ausdruck. Im zweiten Beispiel ist x Scope natürlich die Funktion main.

+1

Danke. Das ist etwas nervig, macht aber Sinn. Ich frage mich, ob die Regeln gelockert werden könnten, um "x" in den Bereich des nachfolgenden Rückgabetyps einzuführen ... –

+0

@VittorioRomeo Erwägen Sie, ein Thema im Forum zu erstellen: https://isocpp.org/forums/iso-c-standard - Vorschau-Vorschläge – alexeykuzmin0

+0

Blick auf den ersten Thread :) –

Verwandte Themen