根据this,用constexpr
声明的函数必须满足一些要求,其中一个要求如下:
至少存在一个参数值,以便函数的调用可以是核心常量表达式的计算子表达式...
好吧,constexpr
函数可以无参数:
constexpr int Bar( /* empty */ ) { return 0xFF; }
constexpr int value = Bar(); // Valid expression
作为子例程调用的 constexpr
函数也不能将整个表达式确定为核心常量表达式。
那么一个参数值必须存在是什么意思?
[未来读者更新]
显然,有关constexpr function
要求的说明已经修复,因为这个问题来自:
至少存在一个参数值,以便函数的调用可以是核心常量表达式的计算子表达式...
为:
至少存在一组参数值,这样函数的调用可以是核心常量表达式的计算子表达式...
答案 0 :(得分:19)
en.cppreference.com引用的标准不准确,实际引用为(§7.1.5/ 5 ):
对于既不是默认也不是模板的
constexpr
函数或constexpr
构造函数,如果不存在参数值,则函数或构造函数的调用可以是核心常量表达式的计算子表达式(5.20)[...]该计划格式不正确;无需诊断。
其中基本上说必须存在一组有效的参数(在你的情况下,空集是一个有效的参数)。
答案 1 :(得分:7)
"一个参数值"这意味着"一组参数"。 Nullary函数有一个可能的参数集,空集。
在你的情况下,这个单个空参数集确实会导致有效的constexpr
调用,所以一切都很好。