最終更新日時: 2026年01月06日 12時47分59秒 (JST)
Koichi Murase が更新

履歴 編集

function
<syncstream>

# std::basic_syncbuf::コンストラクタ(C++20)

    explicit basic_syncbuf(streambuf_type* obuf = nullptr)
      : basic_syncbuf(obuf, Allocator()) { }                          // (1)
    basic_syncbuf(streambuf_type* obuf, const Allocator& allocator);  // (2)
    basic_syncbuf(basic_syncbuf&& other);                             // (3)

## 概要

- (1) : デフォルトコンストラクタ。ラップする`std::basic_streambuf`へのポインタを受け取る。
- (2) : ラップする`std::basic_streambuf`へのポインタ、アロケータを受け取る。
- (3) : ムーブコンストラクタ。

ただし、これらは通常`std::basic_osyncstream`から呼ばれる。

## 効果

- (1), (2) : 同期時排出ポリシー(`sync()`が呼ばれたとき`emit()`を呼び出すかどうか)を`false`に設定し、`std::basic_syncbuf`オブジェクトを作成し、ラップされたストリームバッファを`obuf`に設定する。`obuf`が、関連する出力の最終的な宛先になる。
- (3) : 他のオブジェクトからムーブコンストラクトする。

## 例外

- (1), (2) : ミューテックスの構築から`std::system_error`、またはメモリ割り当てによって`std::bad_alloc` 例外が送出される可能性がある。

## 事後条件

- (1), (2) : `get_wrapped() == obuf`と`get_allocator() == allocator`が`true`となる。
- (3) : `this->get_wrapped()`によって返される値は、このコンストラクタを呼び出す前に`other.get_wrapped()`によって返される値である。 このコンストラクタを呼び出す前に`other`に格納された出力は、`*this`に格納される。 `other.rdbuf()->pbase() == other.rdbuf()->pptr()`と`other.get_wrapped() == nullptr`は`true`である。

## 備考

- (1), (2) : アロケータのコピーは、関連する出力を保持する内部バッファにメモリを割り当てるために使用される。
- (3) : このコンストラクタは、`other`をそのラップされたストリームバッファから切り離し、`other`の破棄によって出力がされないようにする。

## 例

    #include <iostream>
    #include <syncstream>

    int main()
    {
      std::osyncstream bout{std::cout}; // 通常 std::basic_osyncstream から呼ばれる。
      bout << "Hello, World!";
    }

### 出力

    Hello, World!

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 11.1 ✅
- Visual C++: 2019 update 10 ✅

## 参照

- P0053R7 C++ Synchronized Buffered Ostream