首页 > 解决方案 > g++ 和 clang++ 通过引用捕获 `std::integral_constant` 的不同行为

问题描述

给定以下代码

#include <type_traits>

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

   [&]{ constexpr int i = ic; (void)i; }();
 }

(这(void)i;只是为了避免“未使用的变量”警告)clang++ 编译没有问题,其中 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;那么非 constexpr 变量如何初始化constexpr变量呢?

无论如何,行为不会改变定义icconstexpr

constexpr std::integral_constant<int, 42> ic;

clang++ 编译没有问题;g++ 通过引用给出错误捕获。

- 编辑 -

正如 Jans 所指出的,定义icconstexpr并使用聚合初始化

constexpr std::integral_constant<int, 42> ic{};

两个编译器都编译没有问题。

但是没有constexpr

std::integral_constant<int, 42> ic{};

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

标签: c++c++11lambdaconstexprtypetraits

解决方案


推荐阅读