0

これはばかげた質問かもしれませんが、C ++ 11で許可されているにもかかわらず、これを行うべきではない方法について何かを見ましたが、理由はよくわかりません。誰かがこれがなぜであるか説明できますか?

4

1 に答える 1

6

それは許可されていません!

21.4.7basic_string文字列操作[string.ops]

21.4.7.1basic_stringアクセサー[string.accessors]

const charT* c_str() const noexcept;
const charT* data() const noexcept;
  1. 戻り値:[0、size()]の各iに対してp + i ==&operatorとなるようなポインタp。
  2. 複雑さ:一定時間。
  3. 必要条件:プログラムは、文字配列に格納されている値を変更してはなりません。

それ以外は、データ参照をで変更しています。const char *これは通常、を示しますconst_cast<char*>。これにより、未定義の動作が発生するだけでなく、ハーブサッターによると、const最近はスレッドセーフとして読み取る必要があります(およびについての彼の話を参照してくださいconstmutable)。

ただし、すでに述べたように、十分に大きければ使用してstd::string str; &str[0]も安全です。またはstrを使用しないでください。.c_str().data()

于 2013-02-21T22:45:13.567 に答える