Hãy xem xét một ví dụ:Tại sao lambda không thể, khi truyền đến con trỏ hàm, được sử dụng trong ngữ cảnh constexpr?
template <void (*Foo)()>
struct S {
};
int main() {
struct A {
static void x() { }
};
S<&A::x> s;
}
mã biên dịch trong kêu vang, gcc cho rằng x
không có một mối liên hệ ... Ví dụ khá giống chỉ khi sử dụng biểu thức lambda:
template <void (*Foo)()>
struct S {
};
int main() {
auto lambda = []{};
S<+lambda> s;
}
Cả gcc và clang đều đồng ý không biên dịch mã: theo gcc hàm trả về bởi unary + không có liên kết, clang nói ngược lại rằng toán tử cast cho hàm không được khai báo là constexpr. Có bất kỳ lý do nào để không cho phép truyền lambda tới con trỏ hàm được sử dụng trong ngữ cảnh constexpr không?
Tìm dưới đây lỗi được tạo ra bởi trình biên dịch và trình diễn trực tiếp:
gcc:
prog.cc:7:14: error: 'main()::::_FUN' is not a valid template argument for type 'void (*)()' because 'static constexpr void main()::::_FUN()' has no linkage
prog.cc:7:8: note: non-constexpr function 'operator void (*)()' cannot be used in a constant expression
'lambda' không liên kết vì http://eel.is/c++draft/basic.link#8 và dĩ nhiên toán tử'() không phải là 'constexpr', do đó, đó là vấn đề những gì lỗi được phát ra đầu tiên - Tôi có sai không? – skypjack
@skypjack Đó là cùng một kết luận tôi đã đến, sau một chút tìm kiếm xung quanh (đó là lý do tương tự như tại sao 'A' không có liên kết). Và, ngoài ra, các loại không có liên kết, không thể được sử dụng làm đối số mẫu. –