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表达式.与任何其他表达式一样,它可能是另一个表达式中的子表达式,最常见于条件运算符中:
Run Code Online (Sandbox Code Playgroud)double f(double d) { return d > 1e7 ? throw std::overflow_error("too big") : d; } // ...
但我不太确定这是我在找什么.
好吧,这是因为函数返回中的return语句void可以有一个void操作数:
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.