web-dev-qa-db-ja.com

C ++ 03とC ++ 11のc_str関数仕様の違い

_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)は後者にも当てはまりませんか?

26
Chiel

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で終了しますか? はい。

20
gsamaras

閉じ括弧の違いに注意してください。

[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 []の呼び出し後に新しいバッファが作成されたときに発生する可能性があります。

9
VTT

C++ 11より前は、文字列データがnullで終了するかどうかは指定されていませんでした。 C++ 11は、nullで終了する必要があると言っています。

0
user2100815