【发布时间】:2021-01-04 17:51:49
【问题描述】:
考虑这个函数:
std::vector<unsigned> copy(std::vector<unsigned> const& v) noexcept
{ return v; }
int main()
{
try {
(void)copy({1, 2, 3});
} catch(...) {}
}
返回对象的副本构造可能会抛出。在这种情况下,异常是否会传播给调用者(即它被认为发生在main 中)并因此将在catch(...) 处理程序中处理?或者异常会遇到noexcept 并导致调用std::terminate()?
C++17/C++20 中关于生命周期规则的更改(标准化 RVO、临时实现、隐式对象创建等)是否在这方面相对于以前版本的标准改变了一些规则?
【问题讨论】:
-
从 noexcept 函数返回时复制构造函数抛出调用
std::terminate,因此可能不太好 godbolt.org/z/seMbG1(尽管这不能代替标准中的引用) -
“合法”是什么意思?为什么不合法?
-
@Barry 措辞改进。
标签: c++ exception c++17 language-lawyer c++20