【问题标题】:Why is this constexpr function ill-formed?为什么这个 constexpr 函数格式不正确?
【发布时间】: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


【解决方案1】:

f(bool) 格式正确,f(false) 是核心常量表达式。

它的 f() 格式不正确,所有参数值(在本例中为空集)都会导致调用 f(true),而 f(true) 又会抛出异常。

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2014-03-20
    • 2019-06-28
    相关资源
    最近更新 更多