2011-06-21 50 views
44
struct Test 
{ 
    static const int value = []() -> int { return 0; }(); 
}; 

Với gcc-4.6 Tôi nhận được một cái gì đó như, error: function needs to be constexpr. Tôi đã thử nhiều kết hợp đặt constexpr ở những nơi khác nhau, nhưng không may mắn.Có phải constexpr được hỗ trợ với các hàm/biểu thức lambda không?

Có phải constexpr cũng được hỗ trợ cho chức năng lambda (không phân biệt return loại được chỉ định hay không)? Cú pháp chính xác là gì?

Mọi công việc xung quanh đều có thể?

+0

Trong hoàn cảnh nào sẽ một 'chức năng lambda constexpr' có ích? Dường như với tôi như nó sẽ chỉ kết thúc thêm một cặp niềng răng xung quanh biểu hiện thực tế – bdonlan

+0

@bdonlan, tôi có một trường hợp sử dụng cho rằng (để tính toán số '__VA_ARGS__' trong vĩ mô). Nhưng giải thích rằng đó sẽ là một câu hỏi hoàn toàn mới. – iammilind

+2

Cũng thấy [Tại sao các biểu thức lambda không được phép trong một toán hạng không được đánh giá nhưng được cho phép trong các phần không được đánh giá của các biểu thức không đổi?] (Http://stackoverflow.com/q/22232164/1708801) –

Trả lời

22

Cập nhật: Kể từ C++ 17, lambda được phép trong biểu thức không đổi.


Lambdas hiện là (C++ 14) không được phép trong các biểu thức liên tục theo [expr.const]/(2.6), nhưng họ sẽ một lần N4487 được chấp nhận (có thể được tìm thấy trong dự thảo làm việc N4582):

đề xuất này gợi ý cho phép lambda-biểu trong liên tục biểu thức, loại bỏ một hạn chế đang tồn tại. Các tác giả đề xuất rằng biểu thức lambda nhất định và các hoạt động trên một số đóng cửa nhất định các đối tượng được phép xuất hiện trong các biểu thức không đổi. Khi làm như vậy, chúng tôi cũng đề xuất rằng loại đóng cửa được coi là một loại chữ nếu loại của mỗi thành viên dữ liệu của nó là một loại chữ; và, rằng nếu các constexpr specifier được bỏ qua trong lambda-declarator, mà điều hành được tạo ra chức năng gọi được constexpr nếu nó sẽ làm hài lòng các yêu cầu của một hàm constexpr (tương tự như suy luận constexpr rằng đã xảy ra đối với ngầm định các hàm tạo và các hàm toán tử gán).

24

Từ C++ 0x FDI §7.1.5 [dcl.constexpr]/1:

Từ khoá constexpr chỉ được áp dụng với định nghĩa của một biến, tuyên bố của một hàm hoặc chức năng mẫu, hoặc khai báo của một thành viên dữ liệu tĩnh của một kiểu chữ.

Biểu thức lambda không phải là những điều đó và do đó có thể không được khai báo constexpr.

+0

Mọi công việc xung quanh có thể cho điều đó không? – iammilind

+0

Giải pháp cho việc gì? Bạn đang cố gắng làm gì với biểu thức lambda 'constexpr'? Tại sao bạn không thể sử dụng chức năng hoặc mẫu chức năng thông thường? –

+0

Tôi có thể tính số lượng '__VA_ARGS__' của macro tại thời gian chạy bằng cách sử dụng biểu thức lambda. Chỉ cần làm cho nó 'constexpr' sẽ là một hằng số thời gian biên dịch. Giải thích rằng đó sẽ là một chủ đề mới chi tiết. Tôi biết rằng có sẵn các lựa chọn thay thế 'tăng cường', nhưng phương pháp tôi đã sử dụng dường như rất thẳng về phía trước và tiện dụng. – iammilind

9

Trước C++ 17 lambdas không tương thích với constexpr. Chúng không thể được sử dụng bên trong các biểu thức hằng số .

Bắt đầu với C++ 17 lambdas là constexpr nơi có ý nghĩa. Đề xuất N4487 sẽ được đưa vào tiêu chuẩn C++ 17. Trên his website Herb Sutter, chủ tịch của ủy ban ISO C++, đã nêu như sau:

Lambdas bây giờ allowed inside constexpr functions.

1

lùi tới năm 2018 :)

auto my_const_expression_lambda = []() 
    constexpr -> bool 
{ 
    return true ; 
} 

Kể từ C++ 17

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