# std::basic_string<CharT,Traits,Allocator>::data

< cpp‎ | string‎ | basic string

| (1) |
const CharT* data() const; |  | (C++11 前)
const CharT* data() const noexcept; |  | (C++11 起) (C++20 前)
constexpr const CharT* data() const noexcept; |  | (C++20 起)
| (2) |
CharT* data() noexcept; |  | (C++17 起) (C++20 前)
constexpr CharT* data() noexcept; |  | (C++20 起)

返回指向作为字符存储工作的底层数组的指针。此指针满足范围 `[data(); data() + size())` (C++11 前) `[data(); data() + size()]` (C++11 起) 为合法，且其中的值对应存储于字符串的值。

不要求返回的数组是空终止的。 若 empty() 返回 true ，则指针指向不应解引用的非空指针。 | (C++11 前)
返回的数组是空终止的，即 `data()` 与 c_str() 进行同一功能。 若 empty() 返回 true ，则指针指向单个空字符。 | (C++11 起)

指向 `data()` 的指针可能因以下情况非法：

- 传递非 const 引用给任何标准库函数，或
- 在 string 上调用非 const 成员函数，除了 `operator[]()` 、 at() 、 front() 、 back() 、 begin() 、 end() 、 rbegin() 、 rend() 。

1) 通过 `data` 的 const 重载修改数组有未定义行为。
2) 修改存储于 `data() + size()` 的尾后空终止符为任何异于 `CharT()` 的值有未定义行为。

### 参数

（无）

### 返回值

指向底层字符存储的指针。

对 `[0, size())` 中每个 `i` 有 data()[i] == operator[](i) 。 | (C++11 前)
对 `[0, size()]` 中每个 `i` 有 data() + i == std::addressof(operator[](i)) 。 | (C++11 起)

### 复杂度

常数。

### 示例

    #include <algorithm>
    #include <cassert>
    #include <cstring>
    #include <string>

    int main()
    {
      std::string const s("Emplary");
      assert(s.size() == std::strlen(s.data()));
      assert(std::equal(s.begin(), s.end(), s.data()));
      assert(std::equal(s.data(), s.data() + s.size(), s.begin()));
      assert(0 == *(s.data() + s.size()));
    }

### 参阅

front (C++11) | 访问首字符 (公开成员函数)
back (C++11) | 访问最后的字符 (公开成员函数)
c_str | 返回字符串的不可修改的 C 字符数组版本 (公开成员函数)