最終更新日時: 2024年03月31日 18時31分22秒 (JST)
Tetsuro Matsumura が更新

履歴 編集

# std(C++23)

`std` は、すべてのC++標準ライブラリ(C++ライブラリおよびC言語互換ライブラリ)の内容を含むモジュール。

    import std;

    int main() {
      std::println("Hello, world!");
    }

ただし、モジュールではマクロをエクスポートできないため、標準ライブラリで定義されるマクロは含まない。

    import std;

    int main() {
      assert(0 < 1); // エラー: assertはマクロなので含まない
    }

マクロを使用したい場合、対応するヘッダーファイルをインクルード(または、ヘッダーユニットとしてインポート)する必要がある。

    import std;
    #include <cassert>

    int main() {
      assert(0 < 1); // OK
    }

このモジュールは、C言語互換ライブラリの内容をグローバル名前空間には導入しない。

    import std;

    int main() {
      std::printf("Hello, world!"); // OK
      printf("Hello, world!");      // エラー: グローバル名前空間では定義されない

      std::size_t x = 0;            // OK
      size_t y = 0;                 // エラー: グローバル名前空間では定義されない
    }

グローバル名前空間にも定義を導入したい場合、`std`の代わりに`std.compat`を使用できる(両方を使う必要はない)。

## この機能が必要になった背景・経緯

C++20に言語機能としてのモジュールを追加する議論と並行して、標準ライブラリをモジュールへ再編する議論も行われていた。 例えば、P0581R1では以下のモジュールが提案されている。

- `std.fundamental`
- `std.core`
- `std.io`
- `std.os`
- `std.concurrency`
- `std.math`
- `std`

しかし、標準ライブラリ全体の再編はあまりにも壮大であり、C++20には間に合わなかった。 これではモジュールの恩恵を受けるのが難しいということで、最小限のモジュールとして`std`がC++23に間に合うように追加された。

## バージョン

### 言語

- C++23

### 処理系

- Clang: ?
- GCC: ?
- ICC: ?
- Visual C++: ?

## 関連項目

- モジュール

## 参照

- P2465R3 Standard Library Modules std and std.compat