gpt4 book ai didi

c++ - 哪些存储类型不完整的 STL 数据结构可以用作类成员?

转载 作者:行者123 更新时间:2023-12-01 14:39:56 24 4
gpt4 key购买 nike

据我所知,从 C++17 开始,一些 STL 数据结构可能“存在”,其中不完整的类型作为描述存储类型的模板参数。例如,我可以使用 std::unique_ptr<Incomplete> (不过我不确定它是否是数据结构)或 std::vector<Incomplete>如果类的所有属性(需要 Incomplete 的定义)都在单独的 .cpp 文件中实现,则作为类成员:

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

那么,上面列出的哪些数据成员对这种用法有效?其他数据结构、智能指针等呢?

最佳答案

假设在类型完成之前,没有任何类成员被显式或隐式使用:
std::unique_ptr 的模板参数总是不完整的和 std::shared_ptr从 C++11 开始,见 [unique.ptr]/5[util.smartptr.shared]/2分别。

N4510 添加了对容器中不完整类型的支持到 C++17,但仅适用于

std::vector
std::list
std::forward_list

并且仅当使用的分配器满足分配器完整性要求时,即,即使值类型本身不完整,分配器类型 X本身是一个完整的类型, std::allocator_traits<X> 的所有成员也是如此。 ,除了 ::value_type .默认分配器 std::allocator满足这些要求。

其他容器都不能用于不完整的类型。根据上面链接的提案,范围仅限于这三个容器“作为第一步”,因为主要实现已经支持它。

关于c++ - 哪些存储类型不完整的 STL 数据结构可以用作类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60020496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com