对于哪些标准库容器类型是容器中的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版本也是如此).
还有其他人吗?
对于任何包含类型对象的容器T,标准(C++ 11 23.2.1/4)要求:
container_type::value_type 是 Tcontainer_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>::pointer并std::allocator_traits<A>::const_pointer从他们不同.
并直接解决哪些标准容器满足这些Container要求的问题:
std::array<T> 根据23.3.2.1/3(有一些例外情况不影响有问题的typedef)std::deque<T> 根据23.3.3.1/2std::forward_list<T> 是,根据23.3.4.1/2(有一些例外,不影响有问题的typedef)std::list<T> 根据23.3.5.1/2std::vector<T>不同(T比其他bool),每23.3.6.1/2(有一些例外,不影响类型定义的问题)std::set<T> 是的,按照23.4.6.1/2std::multiset<T> 根据23.4.7.1/2std::unrdered_set<T> 根据23.5.6.1/2std::unordered_multiset<T> 根据23.5.7.1/2std::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 而不提供其他类型.