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)