Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标记可能导致构造返回对象时发生异常的函数“noexcept”_C++_Exception_C++17_Language Lawyer_C++20 - Fatal编程技术网

C++ 标记可能导致构造返回对象时发生异常的函数“noexcept”

C++ 标记可能导致构造返回对象时发生异常的函数“noexcept”,c++,exception,c++17,language-lawyer,c++20,C++,Exception,C++17,Language Lawyer,C++20,考虑这一功能: std::vector copy(std::vector const&v)无例外 {返回v;} int main() { 试一试{ (作废)副本({1,2,3}); }捕获(…){} } 返回对象的副本构造可能引发错误。在这种情况下,异常是否会传播到调用方(即,它被认为发生在main)中,因此将在catch(…)处理程序中处理?或者异常是否会运行到noexcept,并导致调用std::terminate() C++17/C++20中有关生命周期规则的更改(标准化RVO、临时物化

考虑这一功能:

std::vector copy(std::vector const&v)无例外
{返回v;}
int main()
{
试一试{
(作废)副本({1,2,3});
}捕获(…){}
}
返回对象的副本构造可能引发错误。在这种情况下,异常是否会传播到调用方(即,它被认为发生在
main
)中,因此将在
catch(…)
处理程序中处理?或者异常是否会运行到
noexcept
,并导致调用
std::terminate()


C++17/C++20中有关生命周期规则的更改(标准化RVO、临时物化、隐式对象创建等)是否改变了与以前版本标准相关的一些规则?

C++17的措辞更改增加了返回语句的顺序。增加了以下一段

[stmt.return]

调用结果的复制初始化按顺序进行 在本世纪末临时机构被摧毁之前 由return语句的操作数建立的完整表达式, 然后,在局部变量被破坏之前对其进行排序 包含return语句的块的([stmt.jump])

在销毁作用域中的局部变量之前初始化结果对象。这意味着抛出在函数的范围内。因此,此时抛出的任何异常都不在调用方

因此,将函数标记为
noexcept
将使程序终止

RVO并没有改变这一点。它只影响结果对象在哪个存储中初始化,但初始化本身仍然是函数执行的一部分

在这种情况下,异常是否会传播到调用方(即,它被认为发生在main中),从而在catch(…)处理程序中处理

我不同意。复制必须作为返回语句表达式的一部分在函数范围内完成。因为局部析构函数仅在返回后调用,并且它们定义在函数范围内

是的,C++17对RVO做了一些保证,特别是这个示例现在保证省略:

structfoo{};
富吧(){
富本地;;
返回Foo{};
//Foo:~Foo(本地);
}
Foo-var=bar();
尽管如此,如果
Foo:Foo()
抛出,该函数也不是异常。所有RVO都表示,在
var
变量中没有移动或复制,并且
Foo{}
表达式在
var
位置构造对象。然而,在构造对象时,它不会改变——在函数范围内,甚至在调用析构函数之前


此外,强制RVO在这里不适用,因为
v
不是prvalue,而是l值。

Copy构造函数在从noexcept函数返回时抛出调用
std::terminate
,所以它可能不好(尽管这不能代替标准中的引用),你说“它合法”是什么意思?“为什么不合法?”巴里的措辞有所改进。我编辑了你的答案,因为我改变了我问题的措辞;所以我编辑了你的来匹配。我希望你没问题。巴里编辑了我的问题,所以我又依次编辑了你的答案。哈哈,我也相当确定,所有这些都是C++17之前的预期行为,在C++17之前,措辞让它更清晰。然而,我找不到我最初在哪里读到这个意图。+1对于返回语句序列,我懒得从标准中查找和引用。更好、正确的答案。我大体上同意这个答案中的所有内容。然而,RVO确实在某种程度上有所帮助,因为如果它可能首先避免任何复制构造的话。虽然这不是问题代码的情况。。。