7

我错误地在 a 之后粘贴了一条throw语句,return最终结果如下:

void DXManager::initialize(const std::shared_ptr<nae::Context>& ctx_ptr)
{
    // ...

    if (FAILED(result))
    {
        return throw std::exception("Failed to enumerate display mode list");
    }

    // ...
}

我在注意到错误之前成功构建了解决方案,我很好奇哪个规范允许上述语法。


通过阅读cppreference.com(在 Notes 下),我看到

throw-expression 被归类为 void 类型的纯右值表达式。与任何其他表达式一样,它可能是另一个表达式中的子表达式,最常见于条件运算符中:

double f(double d)
  {
      return d > 1e7 ? throw std::overflow_error("too big") : d;
  }
  // ...

但我不太确定这是我要找的。

4

1 回答 1

6

嗯,这是因为函数返回中的返回语句void可以有一个void操作数:

[stmt.return]/2

return 语句的expr-or-braced-init-list称为其操作数 [...] 具有类型操作数的 return 语句void只能在返回类型为 cv 的函数中使用void

正如您自己发现的那样,throw表达式具有 type void。这条规定是为了使编写通用代码更顺畅。考虑一下:

template<typename T>
T foo() {
    return T();
}

上面的规则(以及另一个定义 的规则void())使上面的模板即使在实例化时也是有效的void

于 2018-08-28T13:49:25.230 回答