代码首先,我们有以下代码用于在编译时累积2015-10-15 14:12:11.434 x ValueA in case -----> Correct / Selected value
2015-10-15 14:12:11.435 x ValueA in set -----> (null)
2015-10-15 14:12:11.435 x ValueB in set -----> (null)
2015-10-15 14:12:11.436 x ValueC in set -----> (null)
2015-10-15 14:12:12.217 x ValueB in case-----> Correct / Selected value
2015-10-15 14:12:12.217 x ValueA in set -----> (null)
2015-10-15 14:12:12.218 x ValueB in set -----> (null)
2015-10-15 14:12:12.218 x ValueC in set -----> (null)
2015-10-15 14:12:14.516 x ValueC in case-----> Correct / Selected value
2015-10-15 14:12:14.517 x ValueA in set -----> (null)
2015-10-15 14:12:14.517 x ValueB in set -----> (null)
2015-10-15 14:12:14.518 x ValueC in set -----> (null)
:
<tr>
<td align="left">
<table>
<tr>
<td valign="center" align="left" style="padding: 2px 2px 0 0;">
<span style="padding: 2px 4px; border: 1px solid #dddddd; border-radius: 6px; -webkit-border-radius: 6px;">
hashtag
</span>
</td>
</tr>
</table>
</td>
</tr>
以及以下代码示例来测试/变换它(即它在编译时评估):
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;
}
lambda更改运算符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函数''
现在做了research我发现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;
^^^^^^^^^^^
lambdas还不支持。
为什么不支持constexpr
lambdas,我们可以首先定义constexpr
lambda?
编辑:
似乎clang不接受code。那么哪个编译器是对的?
答案 0 :(得分:3)
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不正常,所以编译器必定是错误的。
答案 1 :(得分:3)
根据[expr.const] /(2.6),代码确实是不正确的;虽然corresponding proposal正在流传,但lambdas还没有被允许用于常量表达式。 GCC在接受Build
声明时不正确。