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如果聚合initializeconstexpr std::integral_constant ic{}
Related:,,它也会编译。