请考虑下面的简单示例,其中函数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
哪一个编译器就在这里?
请考虑以下带有struct B类型字段的聚合的示例U。该字段的析构函数是私有的,但由于friend声明对聚合可用,不能从main函数调用:
class U {
~U() {}
friend struct B;
};
struct B { U v{}; };
int main()
{
B b; //ok everywhere
auto pb = new B; //ok everywhere
delete pb;
pb = new B{}; //ok in GCC, error in Clang
delete pb;
}
Run Code Online (Sandbox Code Playgroud)
如果使用聚合初始化,B{}则代码仅被 GCC 接受,而 Clang 则报告错误:
error: temporary of type 'U' has private destructor
pb = new B{}; //ok in GCC, error in Clang
^ …Run Code Online (Sandbox Code Playgroud)