相关疑难解决方法(0)

为什么 C++ 中的强制 RVO 需要公共析构函数?

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

哪一个编译器就在这里?

c++ language-lawyer return-value-optimization

37
推荐指数
2
解决办法
1848
查看次数

在 C++ 中创建聚合的代码必须使用聚合字段析构函数吗?

请考虑以下带有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)

c++ aggregate private-members language-lawyer

9
推荐指数
1
解决办法
126
查看次数