根据this的说法,使用constexpr
声明的函数必须满足几个要求,其中之一如下:
至少存在一个参数值,使得函数的调用可以是核心常量表达式的求值的子表达式...
好的,constexpr
函数可以没有参数
constexpr int Bar( /* empty */ ) { return 0xFF; }
constexpr int value = Bar(); // Valid expression
作为子例程调用的constexpr
函数也不能确定整个表达式为核心常量表达式。
那么,一个参数值必须存在意味着什么呢?
面向未来读者的更新
显然,关于constexpr function
要求的描述已经被修复,因为这个问题来自:
至少存在一个参数值,使得函数的调用可以是核心常量表达式的求值的子表达式...
至:
至少存在一组参数值,使得函数的调用可以是核心常量表达式的求值的子表达式...
发布于 2016-09-27 19:30:50
关于标准,en.cppreference.com中的引用不准确,真正的引用是(§7.1.5/5):
对于既不是默认也不是模板的
constexpr
函数或constexpr
构造函数,如果不存在参数值,则函数或构造函数的调用可能是核心常量表达式(5.20)的求值的子表达式...该程序的格式不正确;不需要诊断。
这基本上是说必须存在一个有效的参数集(在您的情况下,空集是一个有效的参数集)。
发布于 2016-09-27 19:30:31
“一个参数值”在这里指的是“一组参数”。Nullary函数有一个可能的参数集,即空集。
在您的例子中,这个空参数集确实导致了一个有效的constexpr
调用,所以一切都很好。
https://stackoverflow.com/questions/39723288
复制相似问题