C++ 为什么这个constexpr函数格式不正确?
根据10.1.5[dcl.constexpr]第5段() 对于既不是默认值也不是模板的constexpr函数或constexpr构造函数,如果不存在参数值,则函数或构造函数的调用可以是核心常量表达式(8.20)的求值子表达式,或者对于构造函数,是某个对象(6.6.2)的常量初始值设定项,则 程序格式不正确,无需诊断。[示例:C++ 为什么这个constexpr函数格式不正确?,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,根据10.1.5[dcl.constexpr]第5段() 对于既不是默认值也不是模板的constexpr函数或constexpr构造函数,如果不存在参数值,则函数或构造函数的调用可以是核心常量表达式(8.20)的求值子表达式,或者对于构造函数,是某个对象(6.6.2)的常量初始值设定项,则 程序格式不正确,无需诊断。[示例: constexpr int f(bool b) { return b ? throw 0 : 0; } // OK constexpr int f(
constexpr int f(bool b)
{ return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // ill-formed, no diagnostic required
...
-[结束示例]
我不知道为什么上面的程序格式不正确。我当然可以看到f(true)
不是核心常量表达式的一部分但是,参数值false
的存在使得f(false)
是核心常量表达式的一部分。有什么问题?f(bool)
格式正确,f(false)
是核心常量表达式
它的f()
格式不正确,所有参数值(在本例中为空集)都会导致调用f(true)
,而这又会引发。f(bool)
格式正确,f(false)
是一个核心常量表达式
它的
f()
格式不正确,所有参数值(在本例中为空集)都会导致调用f(true)
,后者反过来抛出。throw
仅在运行时使用。第一个定义是可以的,因为您不尝试在编译时调用运行时的东西。在第二种情况下,您会这样做,因此通常会得到一个编译器错误(即使不需要诊断)。对f()
的调用不是constexpr
@过路人您的意思是说f(false)
不是核心常量表达式的子表达式吗?f(bool)
格式正确,f(false)
是一个核心常量表达式。永远不能成为核心常量表达式的是f()
。所有参数值(在本例中为空集)都会导致抛出@passery Oh。你说得对。非常感谢。throw
仅用于运行时。第一个定义是可以的,因为您不尝试在编译时调用运行时的东西。在第二种情况下,您会这样做,因此通常会得到一个编译器错误(即使不需要诊断)。对f()
的调用不是constexpr
@过路人您的意思是说f(false)
不是核心常量表达式的子表达式吗?f(bool)
格式正确,f(false)
是一个核心常量表达式。永远不能成为核心常量表达式的是f()
。所有参数值(在本例中为空集)都会导致抛出@passery Oh。你说得对。非常感谢。