Fed*_*dor 37 c++ language-lawyer return-value-optimization
请考虑下面的简单示例,其中函数bar
返回A
具有私有析构函数的类对象,并且必须进行强制返回值优化(RVO):
class A { ~A() = default; };
A bar() { return {}; }
Run Code Online (Sandbox Code Playgroud)
该代码被 Clang 接受,但被 GCC 拒绝并出现错误:
error: 'constexpr A::~A()' is private within this context
2 | A bar() { return {}; }
| ^
Run Code Online (Sandbox Code Playgroud)
https://gcc.godbolt.org/z/q6c33absK
哪一个编译器就在这里?
Bri*_*ian 47
这是CWG 2426。析构函数可能在此上下文中被调用,因为即使在返回A
对象初始化之后,该函数仍有可能无法成功完成:在return
语句期间创建的任何临时变量,以及在范围内的自动局部变量,都必须被销毁,如果销毁抛出,那么作为堆栈展开的一部分,A
对象将被销毁。此时编译器应该要求析构函数可以访问。
注 1:函数最外层作用域中局部变量的析构函数抛出的异常可以被函数 try 块捕获。
注2:返回对象销毁后,允许处理程序执行另一条return
语句。标准中有这样的例子。