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

< cpp‎ | string‎ | basic string

| (1) |
basic_string& append( size_type count, CharT ch ); |  | (C++20 前)
constexpr basic_string& append( size_type count, CharT ch ); |  | (C++20 起)
| (2) |
basic_string& append( const basic_string& str ); |  | (C++20 前)
constexpr basic_string& append( const basic_string& str ); |  | (C++20 起)
| (3) |
basic_string& append( const basic_string& str, size_type pos, size_type count ); |  | (C++14 前)
basic_string& append( const basic_string& str, size_type pos, size_type count = npos ); |  | (C++14 起) (C++20 前)
constexpr basic_string& append( const basic_string& str, size_type pos, size_type count = npos ); |  | (C++20 起)
| (4) |
basic_string& append( const CharT* s, size_type count ); |  | (C++20 前)
constexpr basic_string& append( const CharT* s, size_type count ); |  | (C++20 起)
| (5) |
basic_string& append( const CharT* s ); |  | (C++20 前)
constexpr basic_string& append( const CharT* s ); |  | (C++20 起)
| (6) |
template< class InputIt > basic_string& append( InputIt first, InputIt last ); |  | (C++20 前)
template< class InputIt > constexpr basic_string& append( InputIt first, InputIt last ); |  | (C++20 起)
| (7) |
basic_string& append( std::initializer_list<CharT> ilist ); |  | (C++11 起) (C++20 前)
constexpr basic_string& append( std::initializer_list<CharT> ilist ); |  | (C++20 起)
| (8) |
template < class T > basic_string& append( const T& t ); |  | (C++17 起) (C++20 前)
template < class T > constexpr basic_string& append( const T& t ); |  | (C++20 起)
| (9) |
template < class T > basic_string& append( const T& t, size_type pos, size_type count = npos ); |  | (C++17 起) (C++20 前)
template < class T > constexpr basic_string& append( const T& t, size_type pos, size_type count = npos ); |  | (C++20 起)

后附额外字符到字符串。

1) 后附 `count` 个 `ch` 的副本
2) 后附 string `str`
3) 后附 `str` 的子串 `[pos, pos+count)` 。若请求的子串越过 string 结尾，或若 count == npos ，则后附的子串为 `[pos, size())` 。若 pos > str.size() ，则抛出 std::out_of_range 。
4) 后附范围 `[s, s + count)` 中的字符。此范围能含有空字符。
5) 后附 `s` 所指向的空终止字符串。由首个空字符用 Traits::length(s) 确定字符串的长度。
6) 后附范围 `[first, last)` 中的字符。

若 `InputIt` 为整数类型，则此重载与重载 (1) 拥有相同效果。 | (C++11 前)
此重载仅若 `InputIt` 满足 老式输入迭代器 (LegacyInputIterator) 的要求才参与重载决议。 | (C++11 起)

7) 后附来自 initializer_list `ilist` 的字符。
8) 如同用 std::basic_string_view<CharT, Traits> sv = t; 隐式转换 `t` 为 string_view `sv` ，然后如同用 append(sv.data(), sv.size()) 后附所有来自 `sv` 的字符。此重载仅若 std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> 为 true 且 std::is_convertible_v<const T&, const CharT*> 为 false 才参与重载决议。
9) 如同用 std::basic_string_view<CharT, Traits> sv = t; 隐式转换 `t` 为 string_view `sv` ，然后后附来自 `sv` 子视图 `[pos, pos+count)` 的字符。若请求的子视图越过 `sv` 的结尾，或若 count == npos ，则后附的子视图为 `[pos, sv.size())` 。此重载仅若 std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> 为 true 且 std::is_convertible_v<const T&, const CharT*> 为 false 才参与重载决议。

### 参数

count | - | 要后附的字符数
pos | - | 要后附的首个字符下标
ch | - | 要后附的字符值
first, last | - | 要后附的字符范围
str | - | 要后附的 string
s | - | 指向要后附的字符串的指针
ilist | - | 拥有要后附的字符的 initializer_list
t | - | 可转换为带要后附的字符的 std::basic_string_view 的对象

### 返回值

*this

### 复杂度

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

### 异常

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

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

### 缺陷报告

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

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

### 示例

    #include <string>
    #include <iostream>

    int main() {
        std::basic_string<char> str = "string";
        const char* cptr = "C-string";
        const char carr[] = "Two and one";

        std::string output;

        // 1) 后附 char 3 次。
        // 注意，这是仅有的接受 char 的重载。
        output.append(3, '*');
        std::cout << "1) " << output << "\n";

        //  2) 后附整个 string
        output.append(str);
        std::cout << "2) " << output << "\n";

        // 3) 后附字符串的一部分（此情况为最后 3 个字母）case)
        output.append(str, 3, 3);
        std::cout << "3) " << output << "\n";

        // 4) 后附 C 字符串的一部分
        // 注意，因为 `append` 返回 *this ，我们能一同链式调用
        output.append(1, ' ').append(carr, 4);
        std::cout << "4) " << output << "\n";

        // 5) 后附整个 C 字符串
        output.append(cptr);
        std::cout << "5) " << output << "\n";

        // 6) 后附范围
        output.append(std::begin(carr) + 3, std::end(carr));
        std::cout << "6) " << output << "\n";

        // 7) 后附 initializer_list
        output.append({ ' ', 'l', 'i', 's', 't' });
        std::cout << "7) " << output << "\n";
    }

输出：

    1) ***
    2) ***string
    3) ***stringing
    4) ***stringing Two
    5) ***stringing Two C-string
    6) ***stringing Two C-string and one
    7) ***stringing Two C-string and one list

### 参阅

operator+= | 后附字符到结尾 (公开成员函数)
strcat | 连接两个字符串 (函数)
strncat | 连接两个字符串的一定量字符 (函数)
wcscat | 后附一个宽字符串的副本到另一个 (函数)
wcsncat | 后附来自一个宽字符串的一定量宽字符到另一个 (函数)