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

时间:2018-08-28 13:44:52

标签: c++ visual-studio exception return 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");
    }

    // ...
}

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


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

  

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

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

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

1 个答案:

答案 0 :(得分:6)

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

  

[stmt.return]/2

     

返回语句的 expr-or-braced-init-list 被称为其操作数[...]操作数为void类型的return语句仅应使用在   返回类型为cv void的函数。

您发现自己自己,一个throw表达式的类型为void。这样做可以使编写通用代码更加流畅。考虑一下:

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

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

相关问题