C++1zでは、所有権を持たない文字列クラスとして、basic_string_view
クラスが導入されます。その別名として、char
文字配列を扱うstring_view
、char32_t
文字配列を扱うu32string_view
などが定義されます。
このクラスは、文字列リテラルような文字配列に対して、basic_string
クラスが提供するような便利なメンバ関数を使うためのものです。文字配列はbasic_string
クラスに代入できますが、その際に動的メモリ確保が行われます。しかし、basic_string
クラスの機能を使いたいだけで、basic_string
オブジェクトとして扱いたいわけではないという状況で、basic_string_view
クラスを使用します。
basic_string_view
クラスのために、<string_view>
ヘッダが新設されます。
#include <iostream> #include <string_view> std::string_view extract_part(const std::string_view& str) { // 文字列リテラルから部分文字列を抽出する return str.substr(2, 3); } int main() { // 返された部分文字列の先頭文字を参照する if (extract_part("ABCDEFG").front() == 'C') { // … } }
basic_string_view
は実装内部では文字配列へのポインタと長さくらいしか持たず、動的メモリ確保もしないので軽量です。
string_viewのリテラル
basic_string_view
クラス向けのsv
というリテラル演算子も定義されます。
namespace std { inline namespace literals { inline namespace string_literals { constexpr string_view operator "" sv(const char* str, size_t len) noexcept; constexpr u16string_view operator "" sv(const char16_t* str, size_t len) noexcept; constexpr u32string_view operator "" sv(const char32_t* str, size_t len) noexcept; constexpr wstring_view operator "" sv(const wchar_t* str, size_t len) noexcept; } } }
using namespace std::string_literals; std::string_view sv = "ABCD"sv;
basic_stringとのインタフェース差異
std::basic_string_view
クラスは、std::basic_string
クラスとほぼ同じインタフェースを提供しますが、完全に同じではありません。ここでは、大きめな差異を示します:
basic_string_view
は、アロケータのインタフェースを持たない。クラスのテンプレートパラメータにAllocator
がなく、コンストラクタやメンバ関数のインタフェースもアロケータを受け取らないbasic_string_view
は、remove_prefix()
、remove_suffix()
メンバ関数を持つ。ポインタを後ろにずらすか、長さを減らすかするだけの関数basic_string
クラスのbasic_string
を受け取るインタフェースに、basic_string_view
クラスからの変換機能が追加されるbasic_string_view
は、入力ストリーム演算子を持たない。出力ストリーム演算子は持つbasic_string_view
は、assign()
、append()
、push_back()
、pop_back()
、insert()
、erase()
、replace()
、operator+=
といった動的メモリ確保が必要になる操作や、破壊的な操作は持たない
Boost実装
basic_string_view
はBoostで実験的な実装が行われ、標準への最初の提案バージョンがBoost 1.59.0でbasic_string_ref
という名前で導入された- Boost 1.61.0で
basic_string_view
という名前に変更され、古い名前は非推奨となっている
参照
- N3334 Proposing
array_ref<T>
andstring_ref
- N3442
string_ref
: a non-owning reference to a string - N3512
string_ref
: a non-owning reference to a string, revision 2 - N3609
string_view
: a non-owning reference to a string, revision 3 - N3685
string_view
: a non-owning reference to a string, revision 4 - N3762
string_view
: a non-owning reference to a string, revision 5 - N3849
string_view
: a non-owning reference to a string, revision 6 - N3921
string_view
: a non-owning reference to a string, revision 7 - P0220R0 Adopt Library Fundamentals TS for C++17
- P0220R1 Adopt Library Fundamentals V1 TS Components for C++17 (R1)
- P0254R0 Integrating
std::string_view
andstd::string
- P0254R1 Integrating
std::string_view
andstd::string
- P0254R2 Integrating
std::string_view
andstd::string
- P0403R0 Literal suffixes for
basic_string_view
更新履歴
- 2017/01/24 16:20
string_view
のリテラルについて追記
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。