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

Đây có phải là lỗi hoặc có điều gì đó trong tiêu chuẩn ngăn chặn rõ ràng các đối tượng được chụp bằng cú pháp tổng quát C++ 14 không được sử dụng trong kiểu trả về theo sau của lambda không?


Lưu ý rằng cả hai trình biên dịch đang hạnh phúc với những ảnh chụp không khái quát hóa:

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

'int' từng là loại trả về mặc định, gcc sẽ loại trừ bất kỳ loại nào khác không? – alexeykuzmin0

+0

@ alexeykuzmin0: bắt tốt. [Nó luôn luôn "suy luận" 'int'] (http://melpon.org/wandbox/permlink/OivD8IYUT3Jq0720) ... cập nhật câu hỏi –

+2

Có một số trường hợp lạ với' decltype' và lambdas, ví dụ: [this] (https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/6-VL5bzK6Ik). – TartanLlama

Trả lời

8

TL; DR: Trình biên dịch như mong đợi.

Các tiêu chuẩn xác định ngữ nghĩa lambda như sau [expr.prim.lambda, phần 1]:

lambda-expression:

lambda-introducer lambda-declarator_opt compound-statement 

Đây hợp chất-tuyên bố chỉ là cơ thể của lambda giữa {}, vì mọi thứ khác được bao gồm trong lambda-declarator:

lambda-declarator:

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

Ngoài ra, trong mục 12 của chương cùng, nó nói rằng

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.

Vì vậy, trong ví dụ đầu tiên của bạn, phạm vi biến số x chỉ là nội dung lambda, không bao gồm biểu thức decltype. Trong ví dụ thứ hai, rõ ràng, phạm vi x là hàm main.

+1

Cảm ơn. Điều này hơi khó chịu nhưng có ý nghĩa. Tôi tự hỏi nếu các quy tắc có thể được thoải mái để giới thiệu 'x' trong phạm vi của kiểu trả về sau ... –

+0

@VittorioRomeo Xem xét việc tạo một chủ đề trên diễn đàn: https://isocpp.org/forums/iso-c-standard -future-proposal – alexeykuzmin0

+0

xem chuỗi đầu tiên :) –

Các vấn đề liên quan