给出以下代码
#include <type_traits>
int main ()
{
std::integral_constant<int, 42> ic;
[&]{ constexpr int i = ic; (void)i; }();
}
((void)i;
只是为了避免出现“未使用的变量”警告)c ++++编译没有问题,其中g ++给出了以下错误
prog.cc: In lambda function:
prog.cc:7:27: error: '__closure' is not a constant expression
7 | [&]{ constexpr int i = ic; (void)i; }();
| ^~
按价值捕获
[=]{ constexpr int i = ic; (void)i; }();
两个编译器都可以毫无问题地编译。
与往常一样,问题是:谁是对的? g ++还是clang ++?
-编辑-
JVApen指出,ic
未定义constexpr
;那么not-constexpr变量如何初始化constexpr
变量?
无论如何,将ic
定义为constexpr
的行为不会改变
constexpr std::integral_constant<int, 42> ic;
clang ++编译没有问题; g ++提供了通过引用捕获的错误。
-编辑-
如Jans所指出的,将ic
定义为constexpr
并使用聚合初始化
constexpr std::integral_constant<int, 42> ic{};
两个编译器都可以毫无问题地编译。
但没有constexpr
std::integral_constant<int, 42> ic{};
g ++会出现通常的错误。