【发布时间】:2020-10-01 19:12:03
【问题描述】:
Stroustrup C++ 第 4 版。第 311 页为阶乘描述了 constexpr fac,其中包括一个条件语句。然后在第 312 页上,用条件语句描述 constexpr bad2 并注释它会导致错误。他还在第 312 页指出“constexpr 函数允许递归和条件表达式。”
这两个函数和导致错误的条件语句有什么区别?
#include <iostream>
using namespace std;
constexpr int fac(int n)
{
return (n > 1) ? n*fac(n-1) : 1;
}
constexpr int bad2(int a)
{
if (a>=0) return a; else return -a; // error: if-statement in constexpr function
}
int main(int argc, char *argv[])
{
constexpr int c = 3;
cout << fac(c) << endl;
cout << bad2(c) << endl;
return 0;
}
编译及结果:
g++ -pedantic -Wall test135.cc && ./a.out
6
3
bad2确实会导致C++11模式下的错误。
g++ -pedantic -Wall -std=c++11 test135.cc && ./a.out
test135.cc: In function ‘constexpr int bad2(int)’:
test135.cc:12:1: error: body of ‘constexpr’ function ‘constexpr int bad2(int)’ not a return-statement
}
【问题讨论】:
-
我强烈建议您选择更新的参考。此代码 (
bad2) 在 c++11 中无效,但在 c++14 中有效。 -
谢谢。我添加了编译结果。 C++11 是否仅在某些类型的条件下导致错误?似乎在 g++ 默认 C 标准中已解决,即 C++14?
-
我不是 100% 确定,但
if是statement,?:是一个表达式,因此不允许使用语句(除了单个返回),但表达式是(你可以嵌套?:)。