我在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; } // ...
但是我不太确定这是我想要的东西。
答案 0 :(得分:6)
好吧,这是因为返回void
的函数中的return语句可以有一个void
操作数:
返回语句的 expr-or-braced-init-list 被称为其操作数[...]操作数为
void
类型的return语句仅应使用在 返回类型为cvvoid
的函数。
您发现自己自己,一个throw
表达式的类型为void
。这样做可以使编写通用代码更加流畅。考虑一下:
template<typename T>
T foo() {
return T();
}
以上规则(以及定义void()
的另一条规则)使以上模板即使在为void
实例化时也有效。