std::basic_string_view<CharT,Traits>:: basic_string_view
From cppreference.net
<
cpp
|
string
|
basic string view
|
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 起) |
3)
构造一个指向以
s
所指向元素开头的字符数组的前
count
个字符的视图。
s
可以包含空字符。如果
[
s
,
s
+
count
)
不是有效范围(即使构造函数可能不会访问该范围内的任何元素),则行为未定义。构造完成后,
data()
等于
s
,且
size()
等于
count
。
4)
构造一个指向以空字符结尾的字符串的视图,不包含终止空字符。视图的长度通过
Traits
::
length
(
s
)
确定。如果
[
s
,
s
+
Traits
::
length
(
s
)
)
不是有效范围,则行为未定义。构造后,
data()
等于
s
,且
size()
等于
Traits
::
length
(
s
)
。
5)
在区间
[
first
,
last
)
上构造一个
std::basic_string_view
。若
[
first
,
last
)
不是有效区间、
It
未实际建模
contiguous_iterator
,或
End
未实际为
It
建模
sized_sentinel_for
,则行为未定义。构造后,
data()
等于
std::
to_address
(
first
)
,且
size()
等于
last
-
first
。
仅当满足以下全部条件时,此重载参与重载决议:
-
-
It满足contiguous_iterator, -
End为It满足sized_sentinel_for, -
std::
iter_value_t
<
It
>
与
CharT为相同类型,且 -
End不可转换为 std::size_t 。
-
6)
在范围
r
上构造一个
std::basic_string_view
。构造完成后,
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 > ( ) 不是合法表达式。
-
std::
remove_cvref_t
<
R
>
与
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 中可用 // 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>
的公开成员函数)
|