C++1z(C++17)において文字列リテラルから文字列ビューstd::string_view
へ変換する場合、暗黙の型変換ではなくユーザ定義リテラル""sv
の明示利用が望ましい。
string_view
クラスはC文字列(const char*
)からの非explicit変換コンストラクタを提供する。string_view
ユーザ定義リテラルはstd::literals::string_view_literals
名前空間で定義される。*1- 計算量(complexity):暗黙コンストラクタでは文字列リテラル長に比例 O(N) するが、ユーザ定義リテラル
""sv
では定数時間 O(1) が保証される。 - NUL文字の扱い:文字列リテラルがNUL文字(
'\0'
)を含む場合、暗黙コンストラクタではNUL文字以降が切り捨てられてしまう。ユーザ定義リテラル""sv
ではNUL文字以降も正しく扱うことができる。
// C++1z(C++17) #include <string_view> using namespace std::literals::string_view_literals; // 通常のヌル終端文字列 std::string_view sv1 = "ABC"; // OK: "ABC" size=3 std::string_view sv2 = "ABC"sv; // OK: "ABC" size=3 // NUL文字'\0'を含む文字列 std::string_view sv3 = "X\0Y\0Z"; // NG: "X" size=1 std::string_view sv4 = "X\0Y\0Z"sv; // OK: "X\0Y\0Z" size=5
N4659(C++17 DIS) 24.4/p3, 24.4.2.1/p3-7, 24.4.6/p1より引用。
3 The complexity of
basic_string_view
member functions is O(1) unless otherwise specified.
constexpr basic_string_view(const charT* str);
3 Requires:[str, str + traits::length(str))
is a valid range.
4 Effects: Constructs abasic_string_view
, with the postconditions in Table 64.
5 Complexity: O(traits::length(str)
).
constexpr basic_string_view(const charT* str, size_type len);
6 Requires:[str, str + len)
is a valid range.
7 Effects: Constructs abasic_string_view
, with the postconditions in Table 65.
constexpr string_view operator""sv(const char* str, size_t len) noexcept;
1 Returns:string_view{str, len}
.
関連URL