【问题标题】:What are the requirements for container element type in STDLIB?STDLIB 中对容器元素类型有什么要求?
【发布时间】:2018-05-31 05:56:45
【问题描述】:

我知道的一件事可能不是真的,T 应该是可复制构造,也就是说,T 应该有一个可访问的复制构造函数。

但是,是否还有其他要求,例如可复制分配

作为补充,我记得 Effective STLvector<bool> 不是标准容器,因为它不符合 T *p=&c[0] 格式良好的要求。

【问题讨论】:

  • 你指的是this吗?你问的是什么类型的容器?
  • @codekaizer 所有类型容器的规则。例如,所有容器都要求T 可复制构造
  • 并非所有容器都要求 T 是可复制构造的
  • @M.M 我从this question读到了这个要求。
  • @bigxiao 我认为您误解了标准。如果TCopyInsertable 转换为X,它实际上表示X(a) 的表达式格式正确。如果不是,您不能复制构造容器X<T>。一个简单的例子:std::vector<std::thread> v1; std::vector<std::thread> v2(v1); 抛出一个错误,因为std::thread 已经删除了复制构造函数。因此,您可以拥有threads 中的vector,但不能复制这样的向量。

标签: c++ c++11 containers


【解决方案1】:

我认为对序列容器和关联容器有不同的要求。例如,以下是矢量(有关更多详细信息,请参见 cppreference.com)。另外,请注意,它已被新版本的 c++ 更改。

  • T 必须满足 CopyAssignable 和 CopyConstructible 的要求。 (直到 C++11)

  • 对元素的要求取决于对容器执行的实际操作。一般来说,它是 要求元素类型是完整类型并满足 Erasable 的要求,但许多成员函数要求更严格 要求。 (C++11 起)(C++17 前)

  • 对元素的要求取决于对容器执行的实际操作。一般来说,它是 要求元素类型满足 Erasable 的要求,但是 许多成员函数提出了更严格的要求。这个容器 (但不是它的成员)可以用不完整的元素实例化 如果分配器满足分配器完整性,则键入 要求。 (C++17 起)

【讨论】:

  • copyconstrucible==copyinsertable 吗?
  • @bigxiao 如果是,它们就不是两个不同的概念。使用CopyInsertable 概念,分配器开始发挥作用。有关详细信息,请参阅此答案:stackoverflow.com/a/14916142/580083.
猜你喜欢
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2011-09-25
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多