哪些标准库容器类型是容器内的 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_type
是T
-
container_type::reference
是T
的左值,即T&
-
container_type::const_reference
是T
的常量左值,即const T&
pointer
和 const_pointer
不属于任何 Container
要求,它们只是标准容器中方便的类型定义,取自容器的分配器。
所以,回答你的问题:
value_type
, reference
和 const_reference
一定要如你所料,否则容器不满足Container
要求。请注意,这意味着(例如 Herb Sutter points out ),即 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 的异常(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/