C++ 哪些存储了不完整类型的STL数据结构可以用作类成员?
据我所知,由于C++17,一些STL数据结构可能“存在”,并以不完整的类型作为模板参数来描述存储的类型。例如,如果类的所有属性(需要C++ 哪些存储了不完整类型的STL数据结构可以用作类成员?,c++,stl,c++17,standards,forward-declaration,C++,Stl,C++17,Standards,Forward Declaration,据我所知,由于C++17,一些STL数据结构可能“存在”,并以不完整的类型作为模板参数来描述存储的类型。例如,如果类的所有属性(需要不完整的定义)都在一个单独的.cpp文件中实现,我可以使用std::unique\u ptr(我不确定它是否是一个数据结构)或std::vector作为类成员: class Incomplete; using Complete = int; class Foo { private: std::unique_ptr<Incomplete> u_p;
不完整的定义)都在一个单独的.cpp文件中实现,我可以使用std::unique\u ptr
(我不确定它是否是一个数据结构)或std::vector
作为类成员:
class Incomplete;
using Complete = int;
class Foo {
private:
std::unique_ptr<Incomplete> u_p;
std::vector<Incomplete> v;
std::deque<Incomplete> d;
std::list<Incomplete> l;
std::set<Incomplete> s;
std::unordered_map<Complete, Complete> u_m_cc;
std::unordered_map<Complete, Incomplete> u_m_ci;
std::unordered_map<Incomplete, Complete> u_m_ic;
std::unordered_map<Incomplete, Incomplete> u_m_ii;
public:
// implemented in a separate .cpp which has Incomplete defined:
Foo();
Foo(Foo&&);
Foo& operator=(Foo&&);
Foo(Foo const&);
Foo& operator=(Foo const&);
~Foo();
};
类不完整;
使用Complete=int;
福班{
私人:
std::唯一的\u ptr u\p;
std::向量v;
std::德克d;
std::列表l;
std::集s;
std::无序地图u_m_cc;
std::无序地图u_m_ci;
std::无序地图u u m u ic;
std::无序地图u_m_ii;
公众:
//在单独的.cpp中实施,该.cpp定义不完整:
Foo();
Foo(Foo&&);
Foo&运算符=(Foo&&);
Foo(Foo const&);
Foo&运算符=(Foo常量&);
~Foo();
};
那么,上面列出的哪些数据成员对这种用法有效?其他数据结构、智能指针等呢
由于C++17,一些STL数据结构可能“存在”,而不完整的类型作为描述存储类型的模板参数
这是不正确的
自C++17以来,某些STL类型可能会声明为不完整类型作为模板参数
当类型被实例化时,类型必须是完整的
例如:(未测试的代码)
struct;//残缺的
使用TV=std::vector;//使用不完整的类型T声明了一个类型;好的
电视tv0;//尝试声明TV类型的变量;无法编译。
结构T{int v;};//T现在完成了
电视1;//汇编
假设在类型完成之前没有显式或隐式使用任何类成员:
自C++11以来,std::unique_ptr
和std::shared_ptr
的模板参数始终可能不完整,请分别参见和
在C++17中添加了对容器中不完整类型的支持,但仅针对
std::vector
std::list
std::forward_list
仅当所使用的分配器满足分配器完整性要求时,即,即使值类型本身不完整,分配器类型X
本身也是完整类型,std::allocator\u traits
的所有成员也是完整类型,除了::value\u type
。默认分配器std::allocator
满足这些要求
其他容器都不能用于不完整的类型。根据上面链接的建议,“作为第一步”,范围仅限于这三个容器,因为主要的实现已经支持它。它是否编译?如果没有,哪些成员会产生诊断消息?@eerorikastd::vector
和std::unique\u ptr
都很好,std::unordered\u map
拒绝在我的MSVC上工作:“std::pair使用不完整的结构”。即使它确实编译了一些东西,也不能保证它在标准中,这就是我在此类测试中看到的问题。在堆上分配的STL容器将处理不完整的类型。在堆栈上分配的文件将不会,并且需要包含适当的头文件std::pair
是一个POD,因此任何包含std::pair
作为成员的容器都不能处理不完整的类型。一个有趣的例外是union
,其中分配在堆栈上,但只有union列表的第一个成员需要是完整类型。其他的可能是不完整的。回想起来,std::optional
利用了这个属性。@cpluplusrat它是在C++17(或以前的)标准中声明的吗?这是否意味着我不能使用存储了不完整类型的std::无序_映射?如果有,还有其他选择吗?@walnut:一个普通类型如何(自动)拥有堆资源?谢谢你的更正。我仍然不明白我描述的哪些用法是有效的,如果有的话。在OP的示例中,在类型完成之前,没有一个容器成员被实例化。C++17中明确允许使用不完整类型实例化std::vector
本身(但不是其成员)。我看不出你的解释是如何回答这个问题的。类型list
、forward\u list
和vector
在C++17中被显式调用
std::vector
std::list
std::forward_list