【发布时间】:2018-08-28 13:44:51
【问题描述】:
我错误地将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 表达式被归类为 void 类型的纯右值表达式。与任何其他表达式一样,它可能是另一个表达式中的子表达式,最常见于条件运算符中:
double f(double d) { return d > 1e7 ? throw std::overflow_error("too big") : d; } // ...
但我不太确定这是我要找的东西。
【问题讨论】:
-
@StoryTeller 对您的问题的回答是完全正确的,但关于 cppreference.com 中的示例:标准 [C++14: 5.16/2] 明确允许这种情况:如果第二个或第三个操作数的类型为 void,应满足以下条件之一: 第二个或第三个操作数(但不是两者)是 throw 表达式;结果是另一个的类型和值类别。 通常,如果三元条件的第二个和第三个操作数中只有一个是 void 类型,则代码将无效,但
throw是一种特殊情况。
标签: c++ visual-studio exception return prvalue