# std::basic_stringbuf<CharT,Traits,Allocator>::basic_stringbuf

< cpp‎ | io‎ | basic stringbuf

basic_stringbuf() : basic_stringbuf(std::ios_base::in | std::ios_base::out) { } | (1) | (C++11 起)
| (2) |
explicit basic_stringbuf( std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ); |  | (C++11 前)
explicit basic_stringbuf( std::ios_base::openmode which ); |  | (C++11 起)
explicit basic_stringbuf( const std::basic_string<CharT, Traits, Allocator>& s, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ); | (3) |
basic_stringbuf( const basic_stringbuf& rhs ) = delete; | (4) | (C++11 起)
basic_stringbuf( basic_stringbuf&& rhs ); | (5) | (C++11 起)
explicit basic_stringbuf( const Allocator& a ) : basic_stringbuf(std::ios_base::in | std::ios_base::out, a) { } | (6) | (C++20 起)
basic_stringbuf( std::ios_base::openmode which, const Allocator& a ); | (7) | (C++20 起)
explicit basic_stringbuf( std::basic_string<CharT, Traits, Allocator>&& s, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ); | (8) | (C++20 起)
template<class SAlloc> basic_stringbuf( const std::basic_string<CharT, Traits, SAlloc>& s, const Allocator& a ) : basic_stringbuf(s, std::ios_base::in | std::ios_base::out, a ) { } | (9) | (C++20 起)
template<class SAlloc> basic_stringbuf( const std::basic_string<CharT, Traits, SAlloc>& s, std::ios_base::openmode, const Allocator& a ); | (10) | (C++20 起)
template<class SAlloc> explicit basic_stringbuf( const std::basic_string<CharT, Traits, SAlloc>& s std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ); | (11) | (C++20 起)
basic_stringbuf( basic_stringbuf&& rhs, const Allocator& a ); | (12) | (C++20 起)

1) 默认构造函数。是否初始化序列指针 (`eback()` 、 `gptr()` 、 `egptr()` 、 `pbase()` 、 `pptr()` 、 `epptr()`) 为空指针是实现定义的。
2) 构造 `std::basic_stringbuf` 对象：通过调用 std::basic_streambuf 的默认构造函数初始化基类，以空字符串初始化字符序列，并设置模式为 `which` 。
3) 通过进行同 (1) 中的的操作构造 `std::basic_stringbuf` 对象，随后如同通过调用 str(new_str) 初始化关联字符序列。
4) 复制构造函数被删除； `std::basic_stringbuf` 非可复制构造 (CopyConstructible) 。
5) 通过从另一 `std::basic_stringbuf` 对象 `rhs` 移动所有状态，包含关联 string 、打开模式、 locale 和所有其他状态，移动构造 `std::basic_stringbuf` 对象。移动后，保证 *this 中 std::basic_streambuf 的六个指针异于被移动的 `rhs` 中的指针，除非它们为空。
6-7) 同 (1-2) ，除了用 `a` 构造关联 string 。
8) 同 (3) ，除了用 std::move(s) 构造关联 string 。
9-10) 通过进行同 (1) 中的的操作构造 `std::basic_stringbuf` 对象，随后以 `a` 为其分配器，用 `s` 的内容初始化关联 string 。
11) 同 (3) ，除了 `s` 的分配器的类型不是 `Allocator` 。此重载仅若 `SAlloc` 与 `Allocator` 不是同一类型才参与重载决议。
12) 同 (5) ，除了用 `a` 构造关联 string 。

### 参数

s | - | 用于初始化缓冲区的 `basic_string`
a | - | 用于构造内部 `basic_string` 的另一分配器
rhs | - | 另一 `basic_stringbuf`
which | - | 指定流打开模式。它是位掩码类型，定义下列常量：
常量 | 解释
`app` | 每次写入前寻位到流结尾
`binary` | 以二进制模式打开
`in` | 为读打开
`out` | 为写打开
`trunc` | 在打开时舍弃流的内容
`ate` | 打开后立即寻位到流结尾

### 注解

常由 std::basic_stringstream 的构造函数调用。

异于 std::ios_base::in 和 std::ios_base::out 的打开模式支持级别在实现中各异。 C++11 显式指定 str() 中和此构造函数中支持 std::ios_base::ate ，但 std::ios_base::app 、 std::ios_base::trunc 和 std::ios_base::binary 在不同实现上有不同效果。

### 示例

演示直接调用 basic_stringbuf 的构造函数。

    #include <iostream>
    #include <sstream>

    int main()
    {
        // 默认构造函数（ mode = in|out ）
        std::stringbuf buf1;
        buf1.sputc('1');
        std::cout << &buf1 << '\n';

        // 在尾端模式中的 string 构造函数 (C++11)
        std::stringbuf buf2("test", std::ios_base::in
                                  | std::ios_base::out
                                  | std::ios_base::ate);
        buf2.sputc('1');
        std::cout << &buf2 << '\n';

        // 后附模式测试（结果在编译器间有别）
        std::stringbuf buf3("test", std::ios_base::in
                                  | std::ios_base::out
                                  | std::ios_base::app);
        buf3.sputc('1');
        buf3.pubseekpos(1);
        buf3.sputc('2');
        std::cout << &buf3 << '\n';
    }

输出：

    1
    test1
    est12 (Sun Studio) 2st1 (GCC)

### 缺陷报告

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

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
P0935R0 | C++11 | 默认构造函数曾为 explicit | 使之为隐式

### 参阅

(构造函数) | 构造字符串流 (`std::basic_stringstream<CharT,Traits,Allocator>` 的公开成员函数)