# std::basic_string<CharT,Traits,Allocator>::operator+=

< cpp‎ | string‎ | basic string

| (1) |
basic_string& operator+=( const basic_string& str ); |  | (C++20 前)
constexpr basic_string& operator+=( const basic_string& str ); |  | (C++20 起)
| (2) |
basic_string& operator+=( CharT ch ); |  | (C++20 前)
constexpr basic_string& operator+=( CharT ch ); |  | (C++20 起)
| (3) |
basic_string& operator+=( const CharT* s ); |  | (C++20 前)
constexpr basic_string& operator+=( const CharT* s ); |  | (C++20 起)
| (4) |
basic_string& operator+=( std::initializer_list<CharT> ilist ); |  | (C++11 起) (C++20 前)
constexpr basic_string& operator+=( std::initializer_list<CharT> ilist ); |  | (C++20 起)
| (5) |
template < class T > basic_string& operator+=( const T& t ); |  | (C++17 起) (C++20 前)
template < class T > constexpr basic_string& operator+=( const T& t ); |  | (C++20 起)

后附额外字符到字符串。

1) 后附 string `str` 。
2) 后附字符 `ch` 。
3) 后附 `s` 所指向的空终止字符串。
4) 后附 initializer_list `ilist` 中的字符。
5) 如同用 std::basic_string_view<CharT, Traits> sv = t; 隐式转换 `t` 为 string_view `sv` ，然后后附字符串视图 `sv` 中的字符，如同用 append(sv) 。此重载仅若 std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> 为 true 且 std::is_convertible_v<const T&, const CharT*> 为 false 才参与重载决议。

### 参数

str | - | 要后附的 string
ch | - | 要后附的字符值
s | - | 指向要后附的空终止字符串的指针
ilist | - | 拥有要后附的字符的 std::initializer_list
t | - | 拥有要后附的字符的（可转换为 std::basic_string_view ）的对象

### 返回值

*this

### 复杂度

无标准复杂度保证，典型实现表现类似 `std::vector::insert` 。

### 异常

若因任何原因抛出异常，则此函数无效果（强异常保证）。 (C++11 起)

若操作会导致 `size() > max_size()` ，则抛出 std::length_error 。

### 注解

重载 (2) 能接受任何可隐式转换为 `CharT` 的类型。对于 `CharT` 为 `char` 的 `std::string` ，可接受类型的集合包含任何算术类型。这可能拥有非意图的效果。

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 2946 | C++17 | `string_view` 重载在某些情况下导致歧义 | 通过使之为模板来避免

### 示例

    #include <iostream>
    #include <iomanip>
    #include <string>

    int main()
    {
       std::string str;
       str.reserve(50); // 预留足够的存储空间以避免内存分配
       std::cout << std::quoted(str) << '\n'; // 空字符串

       str += "This";
       std::cout << std::quoted(str) << '\n';

       str += std::string(" is ");
       std::cout << std::quoted(str) << '\n';

       str += 'a';
       std::cout << std::quoted(str) << '\n';

       str += {' ','s','t','r','i','n','g','.'};
       std::cout << std::quoted(str) << '\n';

       str += 76.85; // 等价于 str += static_cast<char>(76.85) ，可能不合意图
       std::cout << std::quoted(str) << '\n';
    }

输出：

    ""
    "This"
    "This is "
    "This is a"
    "This is a string."
    "This is a string.L"

### 参阅

append | 后附字符到结尾 (公开成员函数)