【发布时间】:2015-10-15 21:56:57
【问题描述】:
代码优先,我们有以下代码用于在编译时累积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;
现在如果将运算符 std::plus<int> 更改为 constexpr lambda:
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 函数 ''
现在做了一点research 我发现constexpr lambdas 还不支持。
问:
为什么如果不支持constexpr lambda,我们可以首先定义constexpr lambda?
编辑:
clang 似乎不接受code。那么哪个编译器是对的呢?
【问题讨论】:
-
@NorahAttkins 我已经包含了该参考资料。
-
那么你已经有了分析器(@Columbo 也在说同样的事情)
-
@NorahAttkins 哎呀,我现在才意识到这一点。好吧,看起来肯定是个骗子。
-
@NorahAttkins 这不是骗局。我知道
constexprlambdas 是不允许的。我在问为什么 gcc 在示例中接受它们。
标签: c++ c++11 lambda c++14 constexpr