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

Czy jest to błąd, czy jest coś w standardzie, które jawnie uniemożliwia używanie obiektów ujętych w uogólnioną składnię C++ 14 w zwracanym typie zwracania lambda?


Zauważ, że oba kompilatory są zadowoleni z non-uogólnione zrzuty:

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

'int' był domyślnym typem zwrotnym, czy gcc wyda inny typ? – alexeykuzmin0

+0

@ alexeykuzmin0: dobry połów. [To zawsze "dedukuje" 'int'] (http://melpon.org/wandbox/permlink/OivD8IYUT3Jq0720) ... aktualizowanie pytania –

+2

Istnieje kilka dziwnych przypadków z' decltype' i lambdas, np. [to] (https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/6-VL5bzK6Ik). – TartanLlama

Odpowiedz

8

TL; DR: Kompilatory zachowują się zgodnie z oczekiwaniami.

standard określa semantykę lambda następująco [expr.prim.lambda, część 1]:

lambda-expression:

lambda-introducer lambda-declarator_opt compound-statement 

tutaj związek instrukcja_select tylko korpus lambda między {}, ponieważ wszystko jest włączone w lambda declarator:

lambda-declarator:

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

Również w części 12 w tym samym rozdziale, mówi się, że

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.

W pierwszym przykładzie zakres zmienna x to tylko jednostka lambda, bez wyrażenia decltype. W drugim przykładzie, oczywiście zakres x jest funkcją main.

+1

Dzięki. Jest to nieco denerwujące, ale ma sens. Zastanawiam się, czy zasady można by złagodzić wprowadzając 'x' w zakresie końcowego typu zwrotu ... –

+0

@VittorioRomeo Rozważ stworzenie tematu na forum: https://isocpp.org/forums/iso-c-standard -future-propozycje – alexeykuzmin0

+0

spójrz na pierwszy wątek :) –

Powiązane problemy