# std::basic_string_view<CharT,Traits>::basic_string_view

< 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 basic_string_view(R&& r); | (6) | (C++23 起)
constexpr basic_string_view(std::nullptr_t) = delete; | (7) | (C++23 起)

1) 默认构造函数。构造空的 `basic_string_view` 。构造后， data() 等于 `nullptr` ，而 size() 等于 `0` 。
2) 复制构造函数。构造内容同 `other` 的视图。构造后， data() 等于 `other.data()` ，而 size() 等于 `other.size()` 。
3) 构造始于 `s` 所指向元素的字符数组的首 `count` 个字符的视图。 `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) 构造范围 `[first, last)` 上的 `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` 上的 `basic_string_view` 。构造后 data() 等于 ranges::data(r) 而 size() 等于 ranges::size(r) 。

此重载仅若

  - std::remove_cvref_t<R> 与 `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>() 不是合法的表达式，且
  - 若有限定标识 `R::traits_type` 合法并代表理性，则它与 `Traits` 相同才参与重载决议。

7) 不能从 nullptr 构造 `basic_string_view` 。

### 参数

other | - | 用以初始化视图的另一视图
s | - | 用以初始化视图的指向字符数组或 C 字符串的指针
count | - | 要包含于视图的字符数
first | - | 指向序列首字符的迭代器
last | - | 指向序列尾字符后一位置的迭代器或另一哨位
r | - | 含有序列的连续范围

### 复杂度

1-3,5-6) 常数
4) 与 `s` 的长度成线性

### 示例

    #include <array>
    #include <iostream>
    #include <string>
    #include <string_view>
    int main()
    {
        constexpr std::wstring_view wcstr_v = L"xyzzy";

        char array[3] = {'B', 'a', 'r'};
        std::string_view array_v(array, std::size(array));

        std::string cppstr = "Foo";
        std::string_view cppstr_v(cppstr);

        std::array ar = {'P', 'u', 'b'};
        std::string_view ar_v(ar.begin(), ar.end()); // C++20

        std::cout << cppstr_v << ' '
                  << array_v << ' '
                  << ar_v << ' '
                  << wcstr_v.size() << '\n';
    }

输出：

    Foo Bar Pub 5

### 参阅

operator= | 对视图赋值 (公开成员函数)
(构造函数) | 构造 `basic_string` (`std::basic_string<CharT,Traits,Allocator>` 的公开成员函数)