_std::string
_のc_str()
のC++ reference では、次のように表示されます。
戻り値
基になる文字ストレージへのポインタ。data()[i] == operator[](i) for every i in [0, size())
(C++ 11まで)data() + i == &operator[](i) for every i in [0, size()]
(C++ 11以降)
C++ 11以降、範囲が1要素増加したことを除けば、この2つの違いはわかりません。
前者のステートメントdata()[i] == operator[](i)
は後者にも当てはまりませんか?
C++ 11以降の1要素による範囲の増分を除いて、次の間に大きな違いがあります。
_data()[i] == operator[](i)
_
そして:
_data() + i == &operator[](i)
_
その主な違いは、プロトタイプの_&
_演算子です。
返されたポインタが元のバッファを保持しているバッファとは別のバッファを指す可能性があるため、書き込み操作が発生したときにcopyを作成できる古いプロトタイプストリング。
data()[i]
とdata() + i
の間のプロトタイプの他の違いは、 同等 であるため、重要ではありません。
C++とC++ 11の違いは、前者では、_std::string
_が、ヌルターミネータを持つかどうかについての標準によって明示的に指定されていなかったことです。ただし、後者ではこれが指定されています。
言い換えると: C++ 11ではstd :: stringは常にnullで終了しますか? はい。
閉じ括弧の違いに注意してください。
[0、size())
[0、size()]
1つ目は排他的範囲を表し(つまり、size
インデックスの項目は含まれません)、2つ目は包括的範囲を表します(つまり、size
インデックスの項目が含まれます)C++以前は、nullを終了する前兆はこの場合は処理されませんが、C++ 11では、size()
位置の文字へのアクセスは明確に定義されています。
data()[i] == operator[](i)
とdata() + i == &operator[](i)
の違いについては、2番目のものは潜在的な実装に対してより多くの制限を適用します。最初のケースでは、data()
によって返されるバッファへのポインタは、operator []
によって返される参照の値が格納されているバッファへのポインタとは異なる場合があります。これは、コピーされた文字列の非const修飾operator []の呼び出し後に新しいバッファが作成されたときに発生する可能性があります。
C++ 11より前は、文字列データがnullで終了するかどうかは指定されていませんでした。 C++ 11は、nullで終了する必要があると言っています。