これはばかげた質問かもしれませんが、C ++ 11で許可されているにもかかわらず、これを行うべきではない方法について何かを見ましたが、理由はよくわかりません。誰かがこれがなぜであるか説明できますか?
質問する
1021 次
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;
- 戻り値:[0、size()]の各iに対してp + i ==&operatorとなるようなポインタp。
- 複雑さ:一定時間。
- 必要条件:プログラムは、文字配列に格納されている値を変更してはなりません。
それ以外は、データ参照をで変更しています。const char *
これは通常、を示しますconst_cast<char*>
。これにより、未定義の動作が発生するだけでなく、ハーブサッターによると、const
最近はスレッドセーフとして読み取る必要があります(およびについての彼の話を参照してくださいconst
mutable
)。
ただし、すでに述べたように、十分に大きければ使用してstd::string str; &str[0]
も安全です。またはstr
を使用しないでください。.c_str()
.data()
于 2013-02-21T22:45:13.567 に答える