关于C++14前constexpr函数要求与示例矛盾的技术问询
C++11 constexpr函数规则与示例的矛盾:是理解偏差,不是描述错误
你提到的cppreference关于C14前(也就是C11)constexpr函数的要求描述是准确的,问题出在对规则细节的理解上。
核心误解点在于:规则限制的是函数体的直接语句类型,而return语句内部的表达式并不受这个限制——只要表达式本身能在编译期求值,就可以包含递归调用、三元运算符、算术运算、constexpr对象访问等复杂逻辑。
举几个cppreference常见示例的说明:
递归阶乘函数:
constexpr int factorial(int n) { return n <= 1 ? 1 : n * factorial(n-1); }函数体只有一个
return语句,里面的三元运算符和递归调用都是表达式的一部分,完全符合“恰好有一个return语句”的要求,不属于额外的函数体语句。带static_assert的函数:
constexpr int positive_add(int a, int b) { static_assert(a >= 0 && b >= 0, "Inputs must be non-negative"); return a + b; }这里
static_assert是规则明确允许的声明类型,加上一个return语句,完全符合要求。包含using声明的函数:
constexpr auto get_default() { using ValueType = unsigned int; return ValueType(100); }using声明是规则允许的内容,配合单一return语句,也符合C++11的constexpr要求。
总结一下:C++11对constexpr函数的限制是函数体不能有除指定类型外的独立语句,但return内部的表达式可以充分利用编译期可求值的语法,这也是为什么你会看到示例里有各种复杂逻辑,但它们都没有违反规则。
内容的提问来源于stack exchange,提问作者Alex O
相关产品推荐
相关产品推荐

