c++11 - C++ when are typedefs in standard library containers not what you would expect? -
c++11 - C++ when are typedefs in standard library containers not what you would expect? -
for standard library container types typedefs within container not naively think?
in code, under conditions on type t , container container_type next static checks not evaluate 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; i know of std::vector<bool>::reference not bool& (and same const version thereof).
are there others?
for container containing objects of type t, standard (c++11 23.2.1/4) requires that:
container_type::value_type t container_type::reference lvalue of t, i.e. t& container_type::const_reference const lvalue of t, i.e. const t& pointer , const_pointer not part of of container requirements, convenience typedefs in standard containers, taken container's allocator.
so, reply question:
value_type, reference , const_reference must expect, otherwise container not satisfy container requirements. notice means (as e.g. herb sutter points out), std::vector<bool> not container in standard sense.
pointer , const_pointer typedefs allocator types, when have container allocator a, differ t* , t const* whenever std::allocator_traits<a>::pointer , std::allocator_traits<a>::const_pointer differ them.
and straight address question of standard containers satisfy these container requirements:
std::array<t> does, per 23.3.2.1/3 (with exceptions don't impact typedefs in question) std::deque<t> does, per 23.3.3.1/2 std::forward_list<t> does, per 23.3.4.1/2 (with exceptions don't impact typedefs in question) std::list<t> does, per 23.3.5.1/2 std::vector<t> (for t other bool), per 23.3.6.1/2 (with exceptions don't impact typedefs in question) std::set<t> does, per 23.4.6.1/2 std::multiset<t> does, per 23.4.7.1/2 std::unrdered_set<t> does, per 23.5.6.1/2 std::unordered_multiset<t> does, per 23.5.7.1/2 std::basic_string<t> contains typedefs in question (to right types) per 21.4./5, though standard not explicitly require satisfy container requirements. note value_type depends on character traits, std::basic_string<t, mytraits> can have value_type other t. std::[unorderd_][multi]map don't qualify because take more 1 mandatory template parameter , utilize them synthesise value_type.
std::valarray<t> not qualify because provides value_type typedef , none of others.
c++ c++11 stl
Comments
Post a Comment