std::basic_string_view<CharT,Traits>::basic_string_view
ja.cppreference.net より
constexpr basic_string_view() noexcept;
|
(1) | (C++17 以降) |
constexpr basic_string_view( const basic_string_view& other ) noexcept = default;
|
(2) | (C++17 以降) |
constexpr basic_string_view( const CharT* s, size_type count );
|
(3) | (C++17 以降) |
constexpr basic_string_view( const CharT* s );
|
(4) | (C++17 以降) |
template< class It, class End >
constexpr basic_string_view( It first, End last );
|
(5) | (C++20 以降) |
template< class R >
constexpr explicit basic_string_view( R&& r );
|
(6) | (C++23 以降) |
basic_string_view( std::nullptr_t ) = delete;
|
(7) | (C++23 以降) |
1) デフォルトコンストラクタ。空の
std::basic_string_viewを構築します。構築後、data()はnullptrと等しく、size()は0と等しくなります。2) コピーコンストラクタ。
otherと同じ内容のビューを構築します。構築後、data()はother.data()と等しく、size()はother.size()と等しくなります。3)
countが指す要素から始まる文字配列の最初のs文字のビューを構築します。sはヌル文字を含むことができます。[s, s + count)が有効な範囲でない場合、動作は未定義です(コンストラクタがこの範囲の要素に一切アクセスしない場合でも同様です)。構築後、data()はsと等しく、size()はcountと等しくなります。4)
sが指すヌル終端文字列のビューを構築します。終端のヌル文字は含みません。ビューの長さはあたかもTraits::length(s)によって決定されたかのようになります。[s, s + Traits::length(s))が有効な範囲でない場合、動作は未定義です。構築後、data()はsと等しく、size()はTraits::length(s)と等しくなります。5) 範囲
std::basic_string_viewに対する[first, last)を構築します。[first, last)が有効な範囲でない場合、Itが実際にcontiguous_iteratorのモデルでない場合、またはEndが実際にに対するsized_sentinel_forItのモデルでない場合、動作は未定義です。構築後、data()はstd::to_address(first)と等しく、size()はlast - firstと等しくなります。
このオーバーロードは、以下の条件がすべて満たされる場合にのみオーバーロード解決に参加します:
Itがcontiguous_iteratorを満たすこと、Endがに対するsized_sentinel_forItを満たすこと、std::iter_value_t<It>とCharTが同じ型であること、そしてEndがstd::size_tに変換可能でないこと。
6) 範囲
std::basic_string_viewに対するrを構築します。構築後、data()はranges::data(r)と等しく、size()はranges::size(r)と等しくなります。
このオーバーロードは、以下の条件がすべて満たされる場合にのみオーバーロード解決に参加します:
std::remove_cvref_t<R>がstd::basic_string_viewと同じ型でないこと、Rがcontiguous_rangeとsized_rangeのモデルであること、ranges::range_value_t<R>とCharTが同じ型であること、Rがconst CharT*に変換可能でないこと、そして- を型
dの左辺値std::remove_cvref_t<R>としたとき、d.operator ::std::basic_string_view<CharT, Traits>()が有効な式でないこと。
7)
std::basic_string_view nullptrから構築することはできません。パラメータ
| other | - | ビューを初期化するための別のビュー |
| s | - | ビューを初期化するための文字配列またはC文字列へのポインタ |
| count | - | ビューに含める文字数 |
| first | - | シーケンスの最初の文字を指すイテレータ |
| last | - | シーケンスの最後の文字の次を指すイテレータ、または別の番兵 |
| r | - | シーケンスを含む連続範囲 |
計算量
1-3,5,6)
定数。
4)
長さに対して線形
s
.
例
このコードを実行
#include <array> #include <iomanip> #include <iostream> #include <string> #include <string_view> int main() { std::string cppstr = "Foo"; std::string_view cppstr_v(cppstr); // オーバーロード (2)、後 // std::string::operator string_view std::cout << "1) cppstr_v: " << std::quoted(cppstr_v) << '\n'; char array[3] = {'B', 'a', 'r'}; std::string_view array_v(array, std::size(array)); // オーバーロード (3) std::cout << "2) array_v: " << std::quoted(array_v) << '\n'; const char* one_0_two = "One\0Two"; std::string_view one_two_v{one_0_two, 7}; // オーバーロード (3) std::cout << "3) one_two_v: \""; for (char c : one_two_v) std::cout << (c != '\0' ? c : '?'); std::cout << "\", one_two_v.size(): " << one_two_v.size() << '\n'; std::string_view one_v{one_0_two}; // オーバーロード (4) std::cout << "4) one_v: " << std::quoted(one_v) << ", one_v.size(): " << one_v.size() << '\n'; constexpr std::wstring_view wcstr_v = L"xyzzy"; // オーバーロード (4) std::cout << "5) wcstr_v.size(): " << wcstr_v.size() << '\n'; std::array ar = {'P', 'u', 'b'}; std::string_view ar_v(ar.begin(), ar.end()); // オーバーロード (5)、C++20 std::cout << "6) ar_v: " << std::quoted(ar_v) << '\n'; // std::string_view ar_v2{ar}; // オーバーロード (6)、C++23でOK // std::cout << "ar_v2: " << std::quoted(ar_v2) << '\n'; // ar_v2: "Pub" [[maybe_unused]] auto zero = [] { /* ... */ return nullptr; }; // std::string_view s{zero()}; // オーバーロード (7)、C++23以降ではコンパイル不可 }
出力:
1) cppstr_v: "Foo" 2) array_v: "Bar" 3) one_two_v: "One?Two", one_two_v.size(): 7 4) one_v: "One", one_v.size(): 3 5) wcstr_v.size(): 5 6) ar_v: "Pub"
関連項目
|
ビューを代入する
(公開メンバ関数) |
|
basic_string
を構築する
(
std::basic_string<CharT,Traits,Allocator>
の公開メンバ関数)
|