GCC constexpr lambda in constexpr functions 和编译时求值

GCC constexpr lambdas in constexpr functions and evaluation in compile time

本文关键字:constexpr 编译 functions lambda in GCC      更新时间:2023-10-16

代码 首先,我们有以下一段代码,用于在编译时累积constexpr std::array

template <typename T, std::size_t N, typename O>
constexpr T compile_time_accumulator(const std::array<T, N> const &A, const std::size_t i, const O& op, const T initialValue)
{
  return (i < N)
       ? op(A[i], compile_time_accumulator(A, i + 1, op, initialValue))
       : initialValue;
}

以及下面的代码示例来测试/验证它(即,它在编译时计算(:

constexpr std::array<int, 4> v {{4, 5, 6, 7}};
std::cout << std::integral_constant<int, compile_time_accumulator(v, 42, std::plus<int>())>::value 
          << std::endl;

现场演示

现在,如果使用 lambda 更改运算符std::plus<int> constexpr

constexpr auto lambda_plus = [] (int x, int y) { return x + y; };

并像下面这样称呼它:

constexpr std::array<int, 4> v {{4, 5, 6, 7}};
std::cout << std::integral_constant<int, compile_time_accumulator(v, 42, lambda_plus)>::value << std::endl;
                                                                         ^^^^^^^^^^^ 

我收到一个错误,即 lambda 不是constexpr

调用非 constexpr 函数 ''

现在做一个小小的研究,我发现constexpr lambdas还不支持。

问:

为什么如果不支持constexpr lambda,我们首先可以定义一个constexpr lambda?

编辑:

似乎叮当不接收代码。那么哪个编译器是正确的呢?

根据 [expr.const]/(2.6(,代码确实格式不正确; Lambda 还不允许在常量表达式中使用,尽管相应的提案正在流通中。海湾合作委员会接受lambda_plus的声明是不正确的。

C++11允许对constexpr进行非常有限的定义,而C++14则有一长串不是constexpr

从 n4296(C++14( 5.20.2.6 的候选版本

5.20 常量表达式 [expr.const]

2 条件表达式 e 是核心常量表达式,除非 E的评估,遵循抽象机的规则(1.9(, 将计算以下表达式之一:

2.6( — 一个 lambda 表达式 (5.1.2(;

所以

答案是lambda不行,所以编译器一定是错误的。