c++ - 为什么 C++ 中强制 RVO 需要公共(public)析构函数?

标签 c++ language-lawyer return-value-optimization

请考虑以下简单示例,其中函数 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/

相关文章:

c++ - nsIURI 没有成员 'asciiSpec' 、 'asciiHost' 等错误

c# - 在 C# 中定义常量

c++ - 返回值复制问题(以改进调试时间)——这里的解决方案是什么?

c++ - Armadillo 是否有用于从矩阵中选择列的 c++ 函数?

c++ - 根据 C++17 标准草案在 block 作用域中声明为 `extern` 的函数的链接

c++ - C++17 之前的类模板参数推导

友元函数的 C++ 内联定义

c++ - 'explicit' 关键字对返回值优化 (RVO) 有何影响?

c++ - 为什么 Visual C++ 不对最琐碎的代码执行返回值优化?

c++ - QDrag 和 Skype 问题(仅限 win)