gpt4 book ai didi

c++ - 相互依赖的 C++ 类,由 std::vector 持有

转载 作者:IT老高 更新时间:2023-10-28 23:17:54 24 4
gpt4 key购买 nike

我很好奇是否可以创建两个类,每个类都有一个 std::vector的另一个。我的第一个猜测是这是不可能的,因为 std::vector需要一个完整的类型,而不仅仅是一个前向声明。

#include <vector>

class B;
class A { std::vector<B> b; };
class B { std::vector<A> a; };

我认为 std::vector<B> 的声明会导致立即失败,因为 B此时有一个不完整的类型。但是,这在 gcc 和 clang 下都能成功编译,没有任何警告。为什么这不会导致错误?

最佳答案

T.C 评论说,这实际上是未定义的行为,正在对标准的更改请求中解决。违反的规则显然是 [res.on.functions] 2.5:

In particular, the effects are undefined in the following cases: [...]

  • if an incomplete type (3.9) is used as a template argument when instantiating a template component, unless specifically allowed for that component.

不管怎样都行得通的原因(以及可以标准化的原因)有两个方面:

  1. 你的程序只包含类型定义;不创建对象,不调用函数,不生成代码。如果我们通过消除 B 的定义来简化它(不需要它),然后尝试创建 A 的实例,它失败了:

    class B;
    class A { std::vector<B> b; };
    A a; // error: ctor and dtor undefined for incomplete type B.

    正如预期的那样,同样失败的是一个简单的

    std::vector<B> b;

    这两种情况的原因是编译器必须生成代码,而不是仅仅在语法上相关的类型声明。

    vector type的使用在其他情况下也是可以的:

    typedef std::vector<B> BVec;
  2. A可以定义,因为正如 Nikolay 在他的回答中正确所说,std::vector<B> 的大小,因此 A 的大小的成员(member)b , 不依赖于 B 的定义(因为 vector 包含指向元素数组的指针,而不是数组本身)。

关于c++ - 相互依赖的 C++ 类,由 std::vector 持有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com