Like:
std::string<T>::size_type
std::list<T>::size_type
std::map<T>::size_type
std::vector<T>::size_type
Both cplusplus.com and cppreference.com say that they are usually size_t
, but are they truly, unambiguously guaranteed by the standard to be size_t
unless a custom allocator is used?
For STL-containers - nope. Table 96 of the standard in [container.requirements.general], which lists container requirements for any container X
, explains it pretty clear:
However, for basic_string
, size_type
is defined as
typedef typename allocator_traits<Allocator>::size_type size_type;
which in turn will be size_t
for std::allocator<..>
as the allocator.
Also, std::array
uses size_t
as size_type
, according to [array.overview]/3.
size_type
isn't guaranteed to be size_t
.
But the default allocator size_type
is, so the default is size_t
.
From the standard 20.6.9
template <class T> class allocator {
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
....
The container's size_type is derived from the allocator:
typedef typename allocator_traits<Allocator>::size_type size_type;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.