返回常量表达式不需要constexpr函数吗?

时间:2015-07-03 12:30:45

标签: c++ c++11

第240页的

C ++入门(第5版)有一条说明:

  

"返回常量表达式"不需要constexpr函数。

有人问过这个问题:can constexpr function return type be a non const?。这个问题的作者误解了这个说明。

但是对它的正确理解是什么(引用帖子的答案澄清了该帖子作者的混淆,但是没有回答我的问题)?

2 个答案:

答案 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