C++ 什么时候标准库容器中的 typedef 不是您所期望的?

标签 c++ c++11 stl

哪些标准库容器类型是容器内的 typedef 而不是您天真地认为的那样?

在代码中,在什么条件下类型 T和容器 container_type执行以下静态检查,但并非所有评估结果都为真:

typedef double T;
typedef std::vector<T> container_type;

std::is_same<typename container_type::value_type, T>::value; 
std::is_same<typename container_type::reference, T&>::value; 
std::is_same<typename container_type::const_reference, T const&>::value; 
std::is_same<typename container_type::pointer, T*>::value;  
std::is_same<typename container_type::const_pointer, T const*>::value;  

我只知道 std::vector<bool>::reference这不是 bool& (这可能与 const 版本相同)。

还有其他的吗?

最佳答案

对于任何包含 T 类型对象的容器, 标准 (C++11 23.2.1/4) 要求:

  • container_type::value_typeT
  • container_type::referenceT 的左值,即 T&
  • container_type::const_referenceT 的常量左值,即 const T&

pointerconst_pointer不属于任何 Container要求,它们只是标准容器中方便的类型定义,取自容器的分配器。

所以,回答你的问题:

value_type , referenceconst_reference一定要如你所料,否则容器不满足Container要求。请注意,这意味着(例如 Herb Sutter points out ),即 std::vector<bool> 不是标准意义上的容器。

pointerconst_pointer是分配器类型的类型定义,所以当你有一个带有分配器的容器时 A , 它们将不同于 T*T const*每当std::allocator_traits<A>::pointerstd::allocator_traits<A>::const_pointer与他们不同。

并直接解决哪些标准容器满足这些问题 Container要求:

  • std::array<T>确实如此,根据 23.3.2.1/3(有一些不影响相关 typedef 的异常(exception)情况)
  • std::deque<T>确实如此,根据 23.3.3.1/2
  • std::forward_list<T>确实如此,根据 23.3.4.1/2(有一些不影响相关 typedef 的异常(exception)情况)
  • std::list<T>确实如此,根据 23.3.5.1/2
  • std::vector<T>确实(对于 T 而不是 bool ),根据 23.3.6.1/2(有一些不影响相关 typedef 的异常(exception)情况)
  • std::set<T>确实,根据 23.4.6.1/2
  • std::multiset<T>根据 23.4.7.1/2
  • std::unrdered_set<T>确实如此,根据 23.5.6.1/2
  • std::unordered_multiset<T>确实,根据 23.5.7.1/2
  • std::basic_string<T>根据 21.4./5 包含有问题的 typedef(到正确的类型),即使标准没有明确要求它满足 Container要求。注意 value_type取决于性格特征,所以std::basic_string<T, MyTraits>可以有value_type除了T .

std::[unorderd_][multi]map不合格,因为它们采用多个强制性模板参数并使用它们来合成 value_type .

std::valarray<T>不符合条件,因为它只提供了 value_type typedef 而不是其他。

关于C++ 什么时候标准库容器中的 typedef 不是您所期望的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26531518/

相关文章:

c++ - Vim 将长字符串分成几个

c++ - 求图形显示/C++中(头文件)文件依赖关系的工具

c++ - 解包类范围?

c++ - 段错误和指针问题

c++ - 如何约束模板化 constexpr 递归函数输入参数

c++ - 将 char 数组(无空终止)转换为字符串的最佳方法是什么

c++ - 同时就地 std::sort 键 vector 和值 vector

c++ - STL vector 与数组

c++ - 直观的线程安全

c++ - 函数模板不适用于字符串文字