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

dav*_*igh 5 c++ stl c++11

对于哪些标准库容器类型是容器中的typedef而不是你天真的想法?

在代码中,在类型T和容器上的条件下container_type执行以下静态检查并非所有求值都为true:

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;  
Run Code Online (Sandbox Code Playgroud)

我只知道std::vector<bool>::reference哪个不是bool&(可能这个const版本也是如此).

还有其他人吗?

Rei*_*ica 6

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

  • container_type::value_typeT
  • container_type::reference是一个左右T,即一个T&
  • container_type::const_reference是一个常数T,即aconst T&

pointer并且const_pointer它们不是任何Container要求的一部分,它们只是标准容器中的便捷typedef,取自容器的分配器.

那么,回答你的问题:

value_type,reference并且const_reference必须如您所愿,否则容器不满足Container要求.注意,这意味着(如例如香草萨特指出),即std::vector<bool>不是在标准意义的容器.

pointer并且const_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)
  • std::deque<T> 根据23.3.3.1/2
  • std::forward_list<T> 是,根据23.3.4.1/2(有一些例外,不影响有问题的typedef)
  • std::list<T> 根据23.3.5.1/2
  • std::vector<T>不同(T比其他bool),每23.3.6.1/2(有一些例外,不影响类型定义的问题)
  • 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_typetypedef 而不提供其他类型.