当前位置: 首页 > 知识库问答 >
问题:

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

隗瑞
2023-03-14
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;
}
error: temporary of type 'U' has private destructor
    pb = new B{}; //ok in GCC, error in Clang
               ^
<source>:2:5: note: implicitly declared private here
    ~U() {}
    ^

演示:https://gcc.godbolt.org/z/c33gbqfqh

我在https://en.cppreference.com/w/cpp/language/aggregate_initialization中没有发现任何关于“析构函数”的提及。标准真的要求聚合字段的析构函数对聚合的每个潜在用户都可用吗?

共有1个答案

袁翔
2023-03-14

标准确实要求访问析构函数。引用N4868(最接近已发布的C++20),[dcl.init.aggr]/8说:

类类型的每个元素的析构函数可能从发生聚合初始化的上下文中调用。[注意:此规定确保在引发异常的情况下,可以为完全构造的子对象调用析构函数。-结束注意]

为了完整性,[class.dtor]/15说:

 类似资料:
  • 是GCC和Clang中的bug,还是标准允许他们接受此代码?

  • 我有以下代码: 在Bouml中,我从这段代码中生成了类图: 图表 我认为 A 和 F 之间的 (https://softwareengineering.stackexchange.com/questions/255973/c-association-aggregation-and-composition) 关系必须产生聚合关系,但它产生了关联关系。如何建立聚合关系?

  • 基本上,我试图通过名字和姓氏找到重复的联系人 我错过了什么吗?任何帮助都将不胜感激。 下面是示例文档之一 我试图对Elasticsearch进行如下查询:

  • 我有一张桌子看起来像这个叫“Makerar”的人 并且我要为每个CNAME选择最大平均数值。 所以我这样做 然而,这将不会给出预期的结果,并且下面显示了不正确的输出。 实际结果应该是 我如何解决这个问题? 注意:此表是根据以前的操作创建的视图。

  • 我试图确认我对关联、聚合的代码外观的理解 聚合:哈斯-a。它具有另一种类型的现有对象 组成:由另一个对象组成 协会:我对此有两种看法。 > 当一个类与另一个类相关联时。因此,上述两个都是关联的示例。 关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。 我的理解正确吗?我在这里和这里阅读了相互矛盾的文章,所以我真的不确定该遵循哪一个。我的理解似乎符合第一个环节。我觉得第二个环节是错误的,或

  • 我有一些架构/模式问题。假设我有一个有两个类的域模型。我使用代码优先和存储库模式。(为了使示例更简单,我只使用字段,而不使用属性) 我还有PersonDto和PetDto类,唯一不同的是,PersonDto中的Pets字段是一个简单的List。我使用Automapper将模型类转换为dto。接下来通过REST Api将Dto发送给客户端。现在,如果在某个视图中,我需要为每个人显示其姓名、姓氏和宠物