GCC constexpr lambda in constexpr functions 和编译时求值
GCC constexpr lambdas in constexpr functions and evaluation in compile time
代码 首先,我们有以下一段代码,用于在编译时累积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不行,所以编译器一定是错误的。
相关文章:
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 用于循环编译的 constexpr
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- constexpr 使用 clang 编译 TensorFlow 时出错
- C++ constexpr语言 - 可以在编译时评估值吗?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 如何判断是否在编译时计算了"constexpr"(无需手动检查)
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- Constexpr变量不是编译时值
- C++constexpr编译问题
- 模板;constexpr;编译时间
- 如果ConstexPR编译了错误分支的时间崩溃
- 使用constexpr编译时间哈希
- 仅在constexpr/编译时上下文中操作时,引用是否有用
- 使用 constexpr 编译时间字符串串联
- C++VS2015 constexpr编译错误,constexpr构造函数调用constexpr成员函数
- Constexpr编译错误使用std::acos与clang++而不是g++
- 使用constexpr编译时出错