2016-09-27 29 views
17

根据this,与constexpr声明的函数必须满足几个要求,其中之一是如下:constexpr函数必须有一个参数值?

存在至少一个参数值使得函数的调用可以被评估核心常量表达式的子表达式...

好,constexpr功能可以没有参数

constexpr int Bar(/* empty */) { return 0xFF; } 
constexpr int value = Bar(); // Valid expression 

constexpr作为子程序调用的函数无法将整个表达式确定为核心常量表达式。

那么一个参数的值是什么意思

[更新为未来的读者]

显然关于constexpr function要求的描述中已被固定,因为从这样一个问题:

存在至少一个参数值使得函数的调用可以是核心常量表达式的评估子表达式...

到:

存在至少一组参数的值使得函数的调用可以是芯常量表达式的评估子表达式...

+3

我*认为*这意味着*为每个参数*至少存在等。 –

+0

@MartinBonner不,它意味着所有参数作为一个整体 –

回答

19

en.cppreference.com引证是在问候标准不准确的,真正的报价(§ 7.1.5/5):

对于constexpr功能或构造constexpr既不是默认的也不一个模板,如果没有参数值存在,使得函数或构造函数的调用可以是核心常量表达式的一个评估子表达式(5.20)[...]该程序不合格;不需要诊断。

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

+2

所以,他们搞砸了措辞的颠倒。 – Yakk

+0

如果空集也被认为是一个有效集,我们甚至可以少于'一组参数值'吗? (因为每个函数必须至少有一个集合,包括一个空集合。)我只是好奇,如果这只是编写标准的一些形式。 –

+1

@DeanSeo你可以有少于一个**有效**参数集合 - 'constexpr int f(std :: string)'是无效的,因为'std :: string'不能是'constexpr',所以无论' f'可能是,那么永远不会有一组有效的参数使'f'的调用成为一个常量表达式。 – Holt

7

“的一个论点价值“在这里意味着”一组参数“。 Nullary函数有一个可能的参数集,即空集。

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

相关问题