我一直在乱搞SVN构建的clang来试验放松的规则constexpr
.我之前无法确定的一件事是,是否可以在constexpr函数中在编译时循环遍历元组内的元素.
因为我没有要测试的符合C++ 14的标准库,所以我准备了以下等效测试:
templateconstexpr int foo() { return N; } constexpr int getSum() { auto sum = 0; for (auto i = 0; i < 10; ++i) { sum += foo(); } return sum; } constexpr auto sum = getSum();
这里有趣的部分是foo()
.在非constexpr函数中,我希望它无法编译,因为您根本无法使用运行时int来生成模板的编译时实例化.constexpr
但是,因为这是一个功能,我怀疑这是否可行.特别是,该值在编译时是已知的,即使它允许变异.
我知道以下代码将编译:
constexpr auto nValue = 2; foo();
在SVN clang中,我的第一个例子没有:
test2.cpp:19:12: error: no matching function for call to 'foo' sum += foo(); ^~~~~~ test2.cpp:11:15: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'N' constexpr int foo() { ^
对于初学者,我很难解释此错误消息的第二部分.除此之外,它是否由C++ 14标准强制执行,如果是这样,有人知道为什么不允许这种语法(简单的监督或防止某些事情)?