考虑下面的代码:为什么不能在常量表达式中显示折叠表达式?
template<int value>
constexpr int foo = value;
template<typename... Ts>
constexpr int sum(Ts... args) {
return foo<(args + ...)>;
}
int main() {
static_assert(sum(10, 1) == 11);
}
铛4.0.1使我有以下错误:
main.cpp:6:17: error: non-type template argument is not a constant expression
return foo<(args + ...)>;
^~~~
这让我很吃惊。每个参数在编译时已知,sum
被标记为constexpr
,所以我没有看到为什么在编译时无法评估fold表达式。
当然,这也失败,出现相同的错误消息:
constexpr int result = (args + ...); // in sum
[expr.prim.fold]
是不是非常有帮助,这是非常短的,只允许描述的语法。
尝试更新版本的clang也给出了和gcc一样的结果。
他们真的被允许吗?
折叠表达式在这里是一个冒烟的枪。 – bolov
@bolov你的意思是红鲱鱼? – Oktalist
@Oktalist是的。谢谢,这正是我所寻找的成语。我刚刚去了下一个最好的事情。 – bolov