コンテナーのサイズが max_size より大きい場合の状況について、どの標準が述べていますか?
UB、std::bad_alloc などですか?
MSVC は例外をスローします。
「コンテナを押し込もうとするとどうなるのmax_size
?」という意味だと思います。コンテナsize
はを超えることができないためmax_size
です。含まれている場合はmax_size
、誤った値を返しました。
正確に何が起こるかは、コンテナと、コンテナのサイズを変更しようとしている操作によって異なりますが、ほとんどのサイズ変更可能なコンテナ(つまりstring
、vector
)の場合、標準ではalength_error
をスローする必要があります。
標準では、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
ifres_arg > max_size()
. 218)218)適切な例外をスローする可能性のある
reserve()
使用。Allocator::allocate()
§23.2.4.2/2-4 (vector
容量):
void reserve(size_type n)
[...]
スロー:length_error
ifn > max_size()
. 248248)適切な例外をスローする可能性のある
reserve()
使用。Allocator::allocate()
標準では、他の標準コンテナー ( deque
、list
、priority_queue
、map
、multimap
、set
、multiset
およびbitset
) については明示的に言及していません。ただし、表 65 (コンテナーの要件) ではmax_size
、「size()
可能な限り最大のコンテナー」と記載されています。