Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个constexpr函数格式不正确?_C++_C++11_Language Lawyer - Fatal编程技术网

C++ 为什么这个constexpr函数格式不正确?

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(

根据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() { 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。你说得对。非常感谢。