问题
Like:
std::string<T>::size_typestd::list<T>::size_typestd::map<T>::size_typestd::vector<T>::size_type- etc.
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?
回答1:
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.
回答2:
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;
来源:https://stackoverflow.com/questions/26433802/is-stdcontainersize-type-guaranteed-to-be-size-t-for-standard-containers-wit