2017-12-19 111 views
8

Tôi đã cố gắng biên dịch mã C++ 11 sau với kết quả hỗn hợp.Lambda trong nhánh không được biểu diễn liên tục: Ai là đúng?

struct NoTemplate { 
    static constexpr auto (*foo)() = false ? +[]{} : nullptr; 
}; 

NoTemplate no_inst; 


template<typename> 
struct YesTemplate { 
    static constexpr auto (*foo)() = false ? +[]{} : nullptr; 
}; 

YesTemplate<float> yes_inst; 
  • kêu vang: Biên dịch NoTemplate thành công; cung cấp error: a lambda expression may not appear inside of a constant expression trên YesTemplate.
  • gcc: Biên dịch cả thành công
  • msvc: Sự cố.
  • icc: Sự cố (chúng tôi có người chiến thắng!)

Kết quả chính xác là gì? Tôi thấy một số ngôn ngữ tiêu chuẩn cho thấy các biểu thức không liên tục nên được OK trong nhánh giả của các toán tử mạch ngắn trong các biểu thức không đổi, nhưng IANALL.

+3

Do sự cố, bạn có nghĩa là trình biên dịch bị lỗi hoặc chương trình bị treo? – user4581301

+0

Trong VC mới nhất (19.12.something) với tiêu chuẩn được đặt thành C++ 17 và cảnh báo được đặt ở cấp 4, tôi nhận được toán tử mơ hồ trên '+' – SoronelHaetir

+2

Trông giống như một lỗi clang, clang HEAD không cung cấp chẩn đoán [xem it ive] (https://wandbox.org/permlink/2I7TE8WOTzZvmeZC) ngôn ngữ [hỗ trợ lambdas trong phần không được đánh giá của điều kiện] (https://stackoverflow.com/q/22232164/1708801) –

Trả lời

0

Chương trình này được thiết lập tốt.

Lưu ý sau C++ 17, biểu thức lambda có thể được chấp nhận trong biểu thức liên tục lõi ngay cả khi nó được đánh giá. Bạn có thể xem giấy được đề xuất N4487 để biết chi tiết.

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