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

为什么下面这段代码起作用?

struct A { std::vector<A> subAs; }; 

A是一个不完整的types,对不对? 如果有一个A *的vector,我会理解。 但在这里我不明白它是如何工作的。 这似乎是一个recursion的定义。

本文被采纳到C ++ 17中 ,它允许在某些STL容器中使用不完整的types。 在此之前,这是“未定义的行为”。 引用这篇论文:

基于对Issaquah会议的讨论,我们达成了以“不完全types的容器”的方式进行*的共识,但将范围限制为std::vectorstd::liststd::forward_list ,作为第一步。

至于标准的变化(重点是我的):

如果分配器满足分配器完整性要求 (17.6.3.5.1),则在实例化vector时可以使用不完整的typesT 在引用vector专业化的任何成员之前, T应该是完整的。

所以,你有它,如果你在实例化std::vector<T, Allocator>时候保留默认的std::allocator<T> std::vector<T, Allocator> ,那么它将总是根据文件使用一个不完整的typesT ; 否则,这取决于您的分配器是可实例化的不完整的typesT


A是一个不完整的types,对不对? 如果有一个A *的vector,我会理解。 但在这里我不明白它是如何工作的。 这似乎是一个recursion的定义。

那里没有recursion。 在一个非常简化的forms,它类似于:

 class A{ A* subAs; }; 

从技术上讲,除了sizecapacity和可能的allocatorstd::vector只需要保存一个指向它通过分配器pipe理的dynamic数组的指针。 (并且指针的大小在编译时已知)。

所以,一个实现可能看起来像这样:

 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; }; }