C++11 では、std::string
§ 21.4.1/5 で指摘されているように、a の文字を連続して格納する必要があります。
basic_string オブジェクト内の文字のようなオブジェクトは、連続して格納されます。つまり、任意の basic_string オブジェクト s について、同一性 &*(s.begin() + n) == &*s.begin() + n は、0 <= n < s.size となる n のすべての値に対して保持されます。 ().
ただし、§ 21.4.7.1 で基になるストレージへのポインターを取得する 2 つの関数を一覧表示する方法を次に示します (強調は私のものです)。
const charT* c_str() const noexcept;
const charT* data() const noexcept;
1 戻り値: [0,size()] 内の各 i に対して p + i == &operator[](i) となるポインター p。
2 複雑さ: 一定時間。
3 必須: プログラムは、文字配列に格納されている値を変更してはなりません。
ポイント番号 3 について私が考えることができる 1 つの可能性は、オブジェクトの次の使用によってポインターが無効になる可能性があることです (§ 21.4.1/6)。
- const 以外の basic_string への参照を引数として取る標準ライブラリ関数への引数として。
- operator[]、at、front、back、begin、rbegin、end、rend を除く非 const メンバー関数の呼び出し。
それでも、イテレータは無効になる可能性がありますが、無効になるまで変更することはできます。ポインターが無効になるまでは、ポインターを使用してバッファーから読み取ることもできます。
このバッファに直接書き込めないのはなぜですか? end()
たとえば、新しい終了で更新されないなど、クラスが矛盾した状態になるためでしょうか? もしそうなら、なぜのようなもののバッファに直接書き込むことが許可されているのstd::vector
ですか?
この使用例には、a のバッファーをstd::string
C インターフェイスに渡して、代わりに a を渡す代わりに文字列を取得し、vector<char>
そこからの反復子で文字列を初期化できることが含まれます。
std::string text;
text.resize(GetTextLength());
GetText(text.data());