- string_view[meta header]
- std[meta namespace]
- basic_string_view[meta class]
- function[meta id-type]
- cpp17[meta cpp]
constexpr basic_string_view() noexcept; // (1)
constexpr basic_string_view(
const basic_string_view&) noexcept = default; // (2)
constexpr basic_string_view(const CharT* str); // (3)
constexpr basic_string_view(const CharT* str, size_type len); // (4)- (1) : デフォルトコンストラクタ。空の
basic_string_viewオブジェクトを構築する - (2) : コピーコンストラクタ。コピー元と同じ文字列を参照する
- (3) : 文字配列を受けとって、その文字配列の全体(ただしヌル文字列を含む場合はそこまで)を参照する
- (4) : 文字配列と長さを受けとって、文字配列
strの先頭len文字を参照する
- (3) : 範囲
[str, str + Traits::length(str))が妥当であること (アクセス可能であること) - (4) : 範囲
[str, str + len)が妥当であること
メンバ変数として、参照する文字配列へのポインタをconst CharT* data_、文字数をsize_type size_があるものとして、
- (1) :
data_ = nullptr;およびsize_ = 0;とする - (3) :
data_ = str;およびsize_ = Traits::length(str);とする - (4) :
data_ = str;およびsize_ = len;とする
- (1), (4) : 定数時間
- (3): 文字数に対して線形時間
basic_string_viewのコンストラクタにtemplate<size_t N>basic_string_view(const charT (&str)[N])タイプの配列を受け取るコンストラクタが無いのは次の使い方をしたときstrのサイズがsizeof(buf)となり、それは利用者の意図しない挙動になる可能性が高いと判断されたからである。
char buf[128];
snprintf(buf, sizeof(buf), "abc");
string_view str(buf);- ヌル文字を含む文字列リテラル全体から
basic_string_viewを構築したい場合はstd::string_view_literals::svリテラルを用いる。
#include <cassert>
#include <iostream>
#include <string_view>
int main()
{
// (1)
// デフォルト構築
{
std::string_view sv;
assert(sv.data() == nullptr);
assert(sv.size() == 0);
}
// (2)
// コピーコンストラクタ。コピー元と同じ文字列を参照する
{
std::string_view base{"Hello World"};
std::string_view sv = base;
std::cout << "(2) : " << sv << std::endl;
}
// (3)
// 文字配列を受けとって参照するコンストラクタ
{
std::string_view sv = "Hello World";
std::cout << "(3) : " << sv << std::endl;
}
// (4)
// 文字配列と文字数を受けとって部分文字列を参照するコンストラクタ
{
// "Hello World"の先頭5文字"Hello"を参照
std::string_view sv{"Hello World", 5};
std::cout << "(4) : " << sv << std::endl;
}
}- sv.data()[link data.md]
- sv.size()[link size.md]
- C++17
- Clang, C++17 mode: 4.0
- GCC, C++17 mode: 7.1
- ICC: ??
- Visual C++: ??