我如何声明同一个类的成员向量?
为什么下面这段代码起作用?
struct A { std::vector<A> subAs; };
A是一个不完整的types,对不对? 如果有一个A *的vector,我会理解。 但在这里我不明白它是如何工作的。 这似乎是一个recursion的定义。
本文被采纳到C ++ 17中 ,它允许在某些STL容器中使用不完整的types。 在此之前,这是“未定义的行为”。 引用这篇论文:
基于对Issaquah会议的讨论,我们达成了以“不完全types的容器”的方式进行*的共识,但将范围限制为
std::vector
,std::list
和std::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; };
从技术上讲,除了size
, capacity
和可能的allocator
, std::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; }; }