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

Alw*_*ing 14 c++ c++11

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

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

有人质疑这个问题:constexpr函数的返回类型是非const吗?.这个问题的作者误解了这个说明.

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

nwp*_*nwp 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
Run Code Online (Sandbox Code Playgroud)

*克里斯的更正.


eca*_*mur 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
Run Code Online (Sandbox Code Playgroud)

这里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
Run Code Online (Sandbox Code Playgroud)