1. ホーム
  2. c++

[解決済み] COW std::stringのC++11での実装の適法性

2022-08-08 10:42:20

質問

私の理解では、copy-on-write は準拠した std::string を実装する現実的な方法ではないと理解していましたが、最近議論になったとき、その発言を直接支持することができないことがわかりました。

C++11 は COW ベースの実装を認めないというのは正しいでしょうか。 std::string ?

もしそうなら、この制限は新しい規格のどこか(どこ)に明示されていますか?

それとも、この制限は、新しい要件の複合的な効果という意味で、暗黙の了解となっているのでしょうか。 std::string のCOWベースの実装を妨げるという意味です。 std::string . この場合、「C++11 は COW ベースの実装を効果的に禁止している」という章と節のスタイルでの派生に興味があります。 std::string の実装を効果的に禁止しています。

どのように解決するのですか?

それは許されません。なぜなら、標準21.4.1 p6によると、イテレータ/参照の無効化は、以下の場合にのみ許可されるからです。

- への参照を取る標準ライブラリ関数への引数としてのみ許可されます。 への参照を引数として取る標準ライブラリ関数の引数としてのみ許可されます。

- 非恒等式 メンバ関数を呼び出すこと。ただし、operator[]、at、front、back、begin、rbegin, end、およびrendを除く。

COW文字列の場合、非構成文字である operator[] を呼び出すと、コピーを作成する(そして参照を無効にする)必要がありますが、これは上の段落で禁止されています。 したがって、C++11 で COW 文字列を持つことはもはや合法ではありません。