constexpr函数必须有一个参数值?

时间:2016-09-27 11:18:31

标签: c++ c++11 language-lawyer constexpr

根据this,用constexpr声明的函数必须满足一些要求,其中一个要求如下:

  

至少存在一个参数值,以便函数的调用可以是核心常量表达式的计算子表达式...

好吧,constexpr函数可以无参数

constexpr int Bar( /* empty */ ) { return 0xFF; }
constexpr int value = Bar(); // Valid expression
作为子例程调用的

constexpr函数也不能将整个表达式确定为核心常量表达式。

那么一个参数值必须存在是什么意思

[未来读者更新]

显然,有关constexpr function要求的说明已经修复,因为这个问题来自:

  

至少存在一个参数值,以便函数的调用可以是核心常量表达式的计算子表达式...

为:

  

至少存在一组参数值,这样函数的调用可以是核心常量表达式的计算子表达式...

2 个答案:

答案 0 :(得分:19)

en.cppreference.com引用的标准不准确,实际引用为(§7.1.5/ 5 ):

  

对于既不是默认也不是模板的constexpr函数或constexpr构造函数,如果不存在参数值,则函数或构造函数的调用可以是核心常量表达式的计算子表达式(5.20)[...]该计划格式不正确;无需诊断。

其中基本上说必须存在一组有效的参数(在你的情况下,空集是一个有效的参数)。

答案 1 :(得分:7)

"一个参数值"这意味着"一组参数"。 Nullary函数有一个可能的参数集,空集。

在你的情况下,这个单个空参数集确实会导致有效的constexpr调用,所以一切都很好。