Các mã sau đây được chấp nhận bởi GCC 7.2 và kêu vang 5.0.0, nhưng bị từ chối bởi Microsoft VS 2017 15.5.0 Preview 5 và Intel C++ 19:lambda Generic và đối số của nó là biểu thức hằng
struct S { };
constexpr int f(S)
{
return 0;
}
int main()
{
auto lambda = [](auto x)
{
constexpr int e = f(x);
};
lambda(S{});
}
Microsoft:
<source>(12): error C2131: expression did not evaluate to a constant
Intel:
<source>(12): error: expression must have a constant value
constexpr int e = f(x);
^
<source>(12): note: the value of parameter "x" (declared at line 10) cannot be used as a constant
constexpr int e = f(x);
^
Nếu tôi thay f(x)
với f(decltype(x){})
, cả Microsoft và Intel đều không phàn nàn. Tôi hiểu rằng x
không phải là một biểu thức liên tục, nhưng nó không được sử dụng bên trong f
. Đây có lẽ là lý do tại sao GCC và clang không phàn nàn.
Tôi đoán rằng trình biên dịch Microsoft và Intel là chính xác khi từ chối mã này. Bạn nghĩ sao?
@RichardHodges, '-std = C++ 14'. – Evgeny
OK bây giờ tôi nghĩ rằng đây là một lỗi của gcc và clang như C++ 14 không đi kèm với lambda constexpr ... này có sẵn từ C++ 17 –
@WF, lambda là cố ý không 'constexpr' (trong mã thực nó không phải là). – Evgeny