std
は、すべてのC++標準ライブラリ(C++ライブラリおよびC言語互換ライブラリ)の内容を含むモジュール。
import std;
int main() {
std::println("Hello, world!");
}
6
import std;
int main() {
std::println("Hello, world!");
}
ただし、モジュールではマクロをエクスポートできないため、標準ライブラリで定義されるマクロは含まない。
import std;
int main() {
assert(0 < 1); // エラー: assertはマクロなので含まない
}
6
import std;
int main() {
assert(0 < 1); // エラー: assertはマクロなので含まない
}
マクロを使用したい場合、対応するヘッダーファイルをインクルード(または、ヘッダーユニットとしてインポート)する必要がある。
import std;
#include <cassert>
int main() {
assert(0 < 1); // OK
}
7
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; // エラー: グローバル名前空間では定義されない
}
10
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++: ?