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

Bu bir hata mıdır, yoksa standart olarak, C++ 14 genelleştirilmiş sözdizimi ile yakalanan nesnelerin lambda'nın son dönüş türünde kullanılmasını açıkça önleyen bir şey var mı? Her iki derleyiciler olmayan jeneralize yakalar memnun olduklarını


Not:

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

'int 'varsayılan bir döndürme türü olarak kullanılmış, gcc başka türden mi çıkar? – alexeykuzmin0

+0

@ alexeykuzmin0: iyi yakalama. [Her zaman 'int' sonucunu çıkarır] (http://melpon.org/wandbox/permlink/OivD8IYUT3Jq0720) ... –

+2

sorusunun güncellenmesi "decltype" ve lambdas ile bazı garip durumlar vardır, örn. [Bu] (https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/6-VL5bzK6Ik). – TartanLlama

cevap

8

TL; DR: beklendiği gibi Derleyiciler davranırlar. her şey dahil olduğu için} {arasında lambda sadece beden

Burada

lambda-expression:

lambda-introducer lambda-declarator_opt compound-statement 

bileşiği ile açıklama aşağıdaki gibidir:

standart [expr.prim.lambda, bölüm 1] lambda anlamını tanımlar lambda-Bildiricisi içinde:

lambda-declarator:

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

Ayrıca aynı bölümün bölüm 12'de, bu söylenir

olduğunu

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.

Yani, ilk örneğinizde x kapsamı yalnızca decltype ifadesini içermeyen lambda gövdesidir. İkinci örnekte, açıkça, x kapsamı main işlevidir.

+1

Teşekkürler. Bu biraz can sıkıcı ama mantıklı. Kurallar, geri dönüş türünün kapsamı içinde 'x' tanıtmak için rahat olabilir mi merak ediyorum ... –

+0

@VittorioRomeo Forumda bir tema oluşturmayı düşünün: https://isocpp.org/forums/iso-c-standard -Future-teklifleri – alexeykuzmin0

+0

ilk konuya bakın :) –