私は多くの時間を見てきましたstd::string::operator[]
は境界チェックをしません。 2013年に尋ねられたWhat is the difference between string::at and string::operator[]?でも、operator[]
は境界チェックを行わないと答えています。これでC++ 11以降ではstd :: string :: operator [] do bounds checkingですか?
私の問題は、私は[string.access]で(この場合はdraft N3797で)標準を見れば、我々は
const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
-
を持っている必要:
pos <= size()
。 - 戻り値:
*(begin() + pos)
pos < size()
の場合。それ以外の場合は、値charT()
のタイプcharT
のオブジェクトへの参照を返します。オブジェクトを変更すると、未定義の動作になります。 - 例外: Nothing。
- 複雑度:一定時間。
これはoperator[]
は、それが文字列またはデフォルトcharT
の要素を返す必要があるかどうかを判断するために境界チェックのいくつかの並べ替えを行う必要があることを信じるように私をリード。この仮定は正しいですか?今すぐ境界チェックを行うにはoperator[]
が必要ですか?
'std :: basic_string :: operator []'は境界チェックをしていないだけでなく、それに準拠するために境界チェックを行うことはできません。標準では、特に**この関数は**何もスローしていないと言います。 –
@DavidHammen境界チェックを行うために何かを投げなければなりませんか?適合する実装が 'pos> = size()'をチェックし、それが必要なら 'charT()'を返すことができませんでしたか? – NathanOliver
@DavidHammen: 'exit()'はスローしておらず、標準に準拠しています。 –