C++ g++;和叮当声++;lambda通过引用捕获“std::integral_常量”的不同行为

C++ g++;和叮当声++;lambda通过引用捕获“std::integral_常量”的不同行为,c++,c++11,lambda,constexpr,typetraits,C++,C++11,Lambda,Constexpr,Typetraits,给定以下代码 #include <type_traits> int main () { std::integral_constant<int, 42> ic; [&]{ constexpr int i = ic; (void)i; }(); } 按价值捕获 [=]{ constexpr int i = ic; (void)i; }(); 两个编译器编译都没有问题 像往常一样,问题是:谁是对的?g++还是铿锵++ --编辑-- 正如JVApe

给定以下代码

#include <type_traits>

int main ()
 {
   std::integral_constant<int, 42> ic;

   [&]{ constexpr int i = ic; (void)i; }();
 }
按价值捕获

[=]{ constexpr int i = ic; (void)i; }();
两个编译器编译都没有问题

像往常一样,问题是:谁是对的?g++还是铿锵++

--编辑--

正如JVApen所指出的,
ic
没有定义
constexpr
;那么,not constexpr变量如何初始化
constexpr
变量呢

无论如何,将
ic
定义为
constexpr

constexpr std::integral_constant<int, 42> ic;
std::integral_constant<int, 42> ic{};
两个编译器编译都没有问题

但是没有
constexpr

constexpr std::integral_constant<int, 42> ic;
std::integral_constant<int, 42> ic{};
std::积分常数ic{};

g++给出了通常的错误。

我实际上认为两者都是错误的,你从来没有将
ic
定义为constexpr,那么你如何使用它来初始化另一个
constexpr
?@JVApen-是的,这是另一个让我困惑的问题;无论如何,我们也有同样的行为,将
ic
定义为
constexpr
@JVApen,值包含在类型中。即使对于非constexpr变量,转换也完全依赖于类型。@max66如果聚合initialize
constexpr std::integral_constant ic{}
Related:,,它也会编译。