はのは、それが問題をに向け思われるものとは何の関係もありませんので、*d
が無効であること可能性について脇に置くましょう。
const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
戻り値:pos < size()
場合は、data()[pos]
を返し
C++ 03標準ではstring::operator[]()
の以下の説明(21.3.4 "basic_string
要素へのアクセス")を有します。それ以外の場合、pos == size()
の場合、constバージョンはcharT()
を返します。それ以外の場合、動作は未定義です。
のコード例ではs
がconst
あるので、行動が明確に定義されているとs[s.size()]
はnull文字を返します。ただし、s
がconst string
でない場合、動作は未定義です。
C++ 11は、const
バージョンのこの奇妙なボールの振る舞いを、このエッジケースでは非constバージョンと大きく異なるように扱います。 C++ 11 21.4.5 "basic_string
要素へのアクセスは、" 言う:
const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
が必要です:pos <= size()
。
戻り値:*(begin() + pos
)pos < size()
場合、値charT()
有するT型のオブジェクトへの参照さもなければ 。参照される値 は修正されないものとする。
だから、C++ 11コンパイラのため、動作がstring
がconst
であるか否かが明確に定義されています。
質問とは無関係に、C++ 11では「参照される値は変更されない」と言われていますが、ちょっと奇妙なことがわかります。その文節がpos == size()
の場合にのみ適用されるかどうかはわかりません。 s[i] = some_character;
のようなものを実行する既存のコードがたくさんあると確信しています。ここで、s
は非const std:string
とi < s.size()
です。これは未定義の動作ですか?私はその句が特別なケースのcharT()
オブジェクトにのみ適用されると考えています。
もう1つの興味深い点は、s[s.size()]
のために返されるオブジェクトのアドレスが、s[s.size() - 1]
のために返されるオブジェクトのアドレスに何らかの形で関連していることを要求していないようです。言い換えれば、返されたcharT()
参照が文字列データの最後に連続している必要はないようです。私はこれが、実装者に、望むならば、そのセンチネル要素の単一の静的コピーへの参照を返す選択肢を与えることではないかと考えています(C++ 11の "変更しない"という制限もあります。場合)。
私はターゲットポインタについてもっと気にします。なぜ関数はサイズパラメータを取っていないのですか? – LaC
おそらく 's.c_str()'をコピーしようとするべきでしょう。 – Yaniro
おそらく 'd'の容量が間違っています – Abyx