什么标准说明了容器大小大于 max_size 的情况?
UB、std::bad_alloc 还是别的什么?
MSVC 引发异常。
我假设您的意思是“如果我尝试将容器推过去会发生什么max_size?” 因为容器size不能超过max_size. 如果是,则max_size返回不正确的值。
究竟会发生什么取决于容器以及尝试调整容器大小的操作,但在大多数可重新调整大小的容器(即 )的情况下string,vector标准要求length_error抛出 a。
该标准要求std::length_error在大多数情况下抛出 a ,但在某些情况下分配器可能会抛出不同的异常。
从 C++03 §21.3/4a(类模板basic_string):
对于任何字符串操作,如果作为操作的结果,
size()将超过max_size(),则操作将抛出length_error。
§21.3.3/10-12(basic_string容量):
void reserve(size_type res_arg=0);
[...]
抛出:length_error如果res_arg > max_size(). 218)218)
reserve()使用Allocator::allocate()可能会引发适当的异常。
§23.2.4.2/2-4(vector容量):
void reserve(size_type n)
[...]
抛出:length_error如果n > max_size(). 248248)
reserve()使用Allocator::allocate()可能会引发适当的异常。
deque对于其他标准容器( 、list、priority_queue、map、multimap、set、multiset和bitset) ,该标准没有明确提及这一点。但是,在表 65(容器要求)中,它说这max_size是“size()可能的最大容器”。