2016-11-26 100 views
2

我四处逛逛这个片段困惑:constexpr函数不带参数

constexpr int f(bool b) { 
    return b ? throw 0 : 0; } 
constexpr int f() { return f(true); } 

直接从c++ draft。 我困惑的一点是为什么该标准定义为不合格的constexpr函数没有参数(在同一链接中声明)的情况。 任何人都可以澄清?

回答

8

如果不存在任何参数值,则该关键字为“,以便函数或构造函数的调用可以是核心常量表达式的评估子表达式”。这不是关于功能f()不采取任何参数;这是关于一个事实,即没有一组参数可以让它返回一个可用值 - 它总是调用f(true),这会引发异常。

要重新迭代:没有参数的constexpr函数当然可以是格式良好的。但对于给定的例子,事实并非如此。

另外值得注意的是“不需要诊断”。这意味着编译器可以自由地接受构造。事实上,GCC在没有抱怨的情况下编译了你问题中的例子。