为什么 return throw std::exception() 在 void 函数中被接受?
Why is return throw std::exception() accepted in a void function?
我错误地在 return
之后粘贴了 throw
语句,最终结果如下:
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(注释下),我明白了
The throw-expression is classified as prvalue expression of type void. Like any other expression, it may be a sub-expression in another expression, most commonly in the conditional operator:
double f(double d)
{
return d > 1e7 ? throw std::overflow_error("too big") : d;
}
// ...
但我不太确定这就是我要找的东西。
嗯,这是因为函数 returning void
中的 return 语句可以有一个 void
操作数:
The expr-or-braced-init-list of a return statement is called its operand [...] A return statement with an operand of type void
shall be used only in
a function whose return type is cv void
.
正如您自己发现的那样,throw
表达式的类型为 void
。这个规定是为了让编写通用代码更顺畅。考虑一下:
template<typename T>
T foo() {
return T();
}
上述规则(以及定义 void()
的另一条规则)使上述模板即使在为 void
.
实例化时也有效
我错误地在 return
之后粘贴了 throw
语句,最终结果如下:
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(注释下),我明白了
The throw-expression is classified as prvalue expression of type void. Like any other expression, it may be a sub-expression in another expression, most commonly in the conditional operator:
double f(double d) { return d > 1e7 ? throw std::overflow_error("too big") : d; } // ...
但我不太确定这就是我要找的东西。
嗯,这是因为函数 returning void
中的 return 语句可以有一个 void
操作数:
The expr-or-braced-init-list of a return statement is called its operand [...] A return statement with an operand of type
void
shall be used only in a function whose return type is cvvoid
.
正如您自己发现的那样,throw
表达式的类型为 void
。这个规定是为了让编写通用代码更顺畅。考虑一下:
template<typename T>
T foo() {
return T();
}
上述规则(以及定义 void()
的另一条规则)使上述模板即使在为 void
.