C ++入门(第5版)有一条说明:
"返回常量表达式"不需要
constexpr
函数。
有人问过这个问题:can constexpr function return type be a non const?。这个问题的作者误解了这个说明。
但是对它的正确理解是什么(引用帖子的答案澄清了该帖子作者的混淆,但是没有回答我的问题)?
答案 0 :(得分:15)
constexpr
函数必须返回 *如果所有参数都是常量表达式,则必须有一个返回常量表达式的路径。这实际上是有道理的。例如:
constexpr int square(int i){
return i*i;
}
std::array<int, square(2)> ia; //works as intended, constant expression
int i;
std::cin >> i;
int j = square(i); //works even though i is not a constant expression
std::array<int, square(i)> ia; //fails, because square does not (and cannot)
//return a constant expression
* chris更正。
答案 1 :(得分:12)
(非模板)constexpr
函数必须至少有一个返回常量表达式的执行路径;形式上,必须存在参数值,以便“函数的调用[...]可以是核心常量表达式的评估子表达式”( [dcl.constexpr] / 5)。例如(同上):
constexpr int f(bool b) { return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // ill-formed, no diagnostic required
此处int f(bool)
允许为constexpr
,因为它的参数值为false
的调用会返回一个常量表达式。
如果函数模板的特化可能至少有一个返回常量表达式的特化,则可能有constexpr
函数不能返回常量表达式。再次,通过上述内容:
template<bool B> constexpr int g() { return f(B); } // OK
constexpr int h() { return g<true>(); } // ill-formed, no diagnostic required