g ++和clang ++的不同行为与la​​mbda通过引用捕获`std :: integral_constant`

时间:2018-12-30 18:54:37

标签: c++ c++11 lambda constexpr typetraits

给出以下代码

#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 ++会出现通常的错误。

0 个答案:

没有答案