简体   繁体   中英

Is std::container::size_type guaranteed to be size_t for standard containers with default allocator?

Like:

  • std::string<T>::size_type
  • std::list<T>::size_type
  • std::map<T>::size_type
  • std::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?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM