请考虑以下简单示例,其中函数 bar
返回类 A
的对象使用私有(private)析构函数,并且必须进行强制返回值优化(RVO):
class A { ~A() = default; };
A bar() { return {}; }
该代码被 Clang 接受,但被 GCC 拒绝并出现以下错误:error: 'constexpr A::~A()' is private within this context
2 | A bar() { return {}; }
| ^
https://gcc.godbolt.org/z/q6c33absK哪一个编译器在这里?
最佳答案
这是CWG 2426 .析构函数可能在此上下文中被调用,因为即使在返回 A
初始化之后对象,函数仍有可能无法成功完成:在 return
期间创建的任何临时对象语句和范围内的自动局部变量必须被销毁,如果销毁抛出,那么作为堆栈展开的一部分,A
对象被销毁。编译器应该要求此时可以访问析构函数。
注1:函数最外层作用域的局部变量的析构函数抛出的异常可以被函数try block 捕获。
注2:返回对象销毁后,允许handler执行另一个return
陈述。标准中有一个例子。
关于c++ - 为什么 C++ 中强制 RVO 需要公共(public)析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68657541/