如何声明同一个类的成员向量?

Dav*_*itS 46 c++ templates vector member incomplete-type

为什么以下代码有效呢?

struct A {
    std::vector<A> subAs;
};
Run Code Online (Sandbox Code Playgroud)

A是不完整的类型,对吧?如果有一个A*s的矢量我会理解.但在这里,我不明白它是如何工作的.它似乎是一个递归的定义.

Whi*_*TiM 37

这个获得通过成C++ 17,其允许在某些STL容器中使用不完整的类型.在此之前,它是未定义的行为.引用该文件:

基于对Issaquah的会议讨论中,我们实现了继续*与方法的共识- "不完全类型的容器",但限制范围std::vector,std::list以及 std::forward_list,作为第一步.

至于标准的变化(强调我的):

如果分配器满足allocator-completeness-requirements (17.6.3.5.1),则 T在实例化时可以使用不完整类型.在引用向量特化的任何成员之前,T应该是完整的.vector

所以,你有它,如果你std::allocator<T>在实例化时保留默认值std::vector<T, Allocator>,那么它将始终T根据文件使用不完整的类型; 否则,它取决于您的分配器是否可以使用不完整类型进行实例化T.


A是不完整的类型,对吧?如果有一个A*s的矢量我会理解.但在这里,我不明白它是如何工作的.它似乎是一个递归的定义.

那里没有递归.以极其简化的形式,它类似于:

class A{
    A* subAs;
};
Run Code Online (Sandbox Code Playgroud)

从技术上讲,除了size,capacity并且可能allocator,std::vector仅需要的的指针保持到动态数组A它通过其分配器管理.(并且在编译时已知指针的大小.)

因此,实现可能如下所示:

namespace std{

    template<typename T, typename Allocator = std::allocator<T>>
    class vector{

        ....

        std::size_t m_capacity;
        std::size_t m_size;
        Allocator m_allocator;
        T* m_data;
    };

}
Run Code Online (Sandbox Code Playgroud)

  • 我认为http://stackoverflow.com/questions/6517231/are-c-recursive-type-definitions-possible-in-particular-can-i-put-a-vectort应该更新:) (6认同)