为什么 return throw std::exception() 在 void 函数中被接受?

Why is return throw std::exception() accepted in a void function?

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

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(注释下),我明白了

The throw-expression is classified as prvalue expression of type void. Like any other expression, it may be a sub-expression in another expression, most commonly in the conditional operator:

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

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

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

[stmt.return]/2

The expr-or-braced-init-list of a return statement is called its operand [...] A return statement with an operand of type void shall be used only in a function whose return type is cv void.

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

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

上述规则(以及定义 void() 的另一条规则)使上述模板即使在为 void.

实例化时也有效