什么标准说明了容器大小大于 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()
可能的最大容器”。