【发布时间】:2017-07-11 05:05:16
【问题描述】:
根据 10.1.5 [dcl.constexpr] 第 5 段 (N4659),
对于既不是默认值也不是模板的 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) 是核心常量表达式的一部分。有什么问题?
【问题讨论】:
-
throw仅适用于运行时。第一个定义是可以的,因为您不会尝试在编译时调用运行时的东西。在第二种情况下,您会这样做,因此通常会出现编译器错误(即使不需要诊断)。 -
没有调用
f()是constexpr -
@PasserBy 你的意思是说
f(false)不是核心常量表达式的子表达式吗? -
f(bool)格式正确,f(false)是核心常量表达式。f()永远不可能是核心常量表达式。所有参数值(在本例中为空集)都会导致throw -
@PasserBy 哦。你说得对。谢谢一百万。
标签: c++ c++11 language-lawyer