2015-09-11 20 views
6

Giả sử tôi có một lambdaLàm cách nào để thêm thuộc tính vào hàm lambda?

auto func = [](std::string msg) { throw std::runtime_error(msg); }; 

(thừa nhận, ví dụ này là không khôn ngoan, nhưng đó không phải là điểm). Nếu đây không phải là một lambda, nhưng một chức năng bình thường, tôi sẽ khai báo nó với thuộc tính noreturn như trong

[[noreturn]] void func(std::string msg) { throw std::runtime_error(msg); } 

thể cũng này được thực hiện cho một lambda? (Tôi đã thử vài biến thể với kêu vang 3.5, nhưng không có bất kỳ thành công.)


chỉnh sửa Sử dụng Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn), tôi đã cố gắng

auto func = [](std::string msg) -> [[noreturn]] void { throw std::runtime_error(msg); }; 

hoặc

auto func = [](std::string msg) [[noreturn]] { throw std::runtime_error(msg); }; 

nhưng cả hai đều từ chối. Đây có phải là sự thiếu sót/lỗi của clang 3.5 không?

+3

Xem [Cách khai báo toán tử lambda() dưới dạng noreturn?] (Http://stackoverflow.com/q/26888805/1708801) –

+0

@ShafikYaghmour Thật vậy. Tôi đã bỏ lỡ điều đó trước khi hỏi. Được đánh dấu câu hỏi của riêng tôi là dupe ngay bây giờ ... – Walter

Trả lời

0

Các tác phẩm sau đây trong g ++ 4.9.3:

void foo() 
{ 
    auto func = [] (std::string msg) [[noreturn]] { throw std::runtime_error(msg); }; 
} 

trình tại http://ideone.com/49Ietf quá.

+0

Vì vậy, từ câu trả lời cho dupe, có vẻ như gcc 4.9.3 đã chấp nhận mã không đúng ... – Walter

+0

@Walter, Điều đó có vẻ như vậy. Tôi tự hỏi liệu có bất kỳ sự cân nhắc nào trong ủy ban tiêu chuẩn để cấm sử dụng '[[noreturn]] 'cho các hàm lambda một cách rõ ràng hay không. –

+1

Tôi nghĩ thực tế là người ta không thể gán một lambda với '[[noreturn]]' là/không có ý định của tiêu chuẩn, nhưng hậu quả không may của nó. * Ngôn ngữ không cung cấp cách nào để bạn áp dụng thuộc tính cho 'toán tử()' của chính lambda. * Ngoài ra, người ta có thể chấp nhận mã ở trên là phần mở rộng ngôn ngữ. – Walter

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