为什么返回抛出std :: exception()在void函数中被接受?

Mar*_*cak 7 c++ return exception visual-studio prvalue

我用以下最终结果错误地粘贴了一个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");
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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


通过阅读cppreference.com(在Notes下),我明白了

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

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

但我不太确定这是我在找什么.

Sto*_*ica 6

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

[stmt.return]/2

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

当你发现自己时,throw表达式就有了类型void.这条规定使得编写通用代码更加顺畅.考虑一下:

template<typename T>
T foo() {
    return T();
}
Run Code Online (Sandbox Code Playgroud)

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