C++17 で追加された C++ Library Fundamentals TS(N3921) の中で string_view
が提案された機能である。
私が理解する限り、これはある種の文字列 "概念" を表す型であり、文字列として表示可能なものを格納できる任意のタイプのコンテナのビューです。
パラメータタイプは
string_view` になるべきでしょうか?string_view
について考慮すべき重要な点はありますか?文字列参照や配列参照の提案の目的は、すでに他の場所にあるデータをコピーしないようにすることであり、変異しないビューだけが必要とされるものです。この問題の string_view
はそのような提案の一つです。それ以前には string_ref
や array_ref
と呼ばれるものもありました。
このアイデアは、常に 既存の データ配列や文字列の最初の要素へのポインタとサイズのペアを保存することです。
このようなビューハンドルクラスは、値によって安価に渡すことができ、安価な部分文字列操作 (これは単純なポインタの増加やサイズの調整として実装することができる) を提供することができるだろう。
文字列の多くの用途は、文字列を実際に所有する必要はなく、問題の文字列はすでに他の誰かに所有されていることがよくあります。そのため、不要なコピーを避けることで効率を上げることができる可能性があります (すべての割り当てと例外を節約できることを考えてみてください)。
オリジナルのCの文字列は、ヌルターミネータが文字列APIの一部であったため、(strtok
のように)基礎となる文字列を変更することなく簡単に部分文字列を作成できないという問題に悩まされていました。C++では、長さを別に保存し、ポインタとサイズを1つのクラスにラップすることで簡単に解決できます。
C++の標準ライブラリの哲学から逸脱した、1つの大きな障害は、このような "参照ビュー" クラスが標準ライブラリの他の部分と完全に異なる所有権セマンティクスを持っているということです。基本的に、標準ライブラリの他のすべては、無条件に安全で正しい(コンパイルできれば正しい)ものです。このような参照クラスでは、それはもはや真実ではありません。プログラムの正しさは、これらのクラスを使用するアンビエントコードに依存します。そのため、チェックするのも教えるのも難しくなっています。