1. C++の基本的な言語機能①
1.1 Hello world (C++23)¶
C++23では <print>
ライブラリが導入されたため、いきなり何もかも違います。
std::println
は書式付きで出力してくれる関数で、出力の末尾に改行が付きます。
hello_cpp23_world.cpp
#include <print>
int main() {
std::println("{}", "Hello, C++23 world!");
}
1.3 演算子¶
演算子が3つ追加されている (C++20):
- <=>
- co_await
- co_yield
ひとつめは三方比較演算子(three-way comparison operator)である。
a <=> b
による比較の結果は、未満・等しい・超える、という3つの関係を同時に表す値を返す。
戻り値の型が比較カテゴリ型になっていて、半順序・弱順序・全順序を表すことができて便利。
あとのやつはコルーチン関係だが、今は覚えなくていい。
1.4 条件分岐¶
制御構文は初期化子と条件式を分けて書ける(Since C++17):
if (int i = 1; i > 2) {
// ...
}
制御構文には type alias が書ける(Since C++23):
if (using T = int; T a = 1; a > 2) {
// ...
}
1.5 組み込み型とポインター¶
- 符号付き整数型が2の補数表現であることを規定 (Since C++20)
- サイズリテラル(operator ""z)(Since C++23)
1.7 繰り返し¶
range-based for は初期化子を書ける (Since C++20)
一時変数を変数に格納して range-based for を回すことができる:
std::vector<std::string> generate() {
return { "foo", "bar" };
}
for (std::vector vec = generate(); auto&& item : vec) {
// ...
}
C++23からはそもそも範囲初期化子の一時変数は寿命が延長される:
// itemは一時変数の要素を参照するが、C++23からはOK
for (auto&& item : generate()) {
// ...
}
理解度チェック¶
- if文の初期化子を使うメリットはなんでしょう
- C++17で range-based for を書くときに気をつけるべき事柄はなんでしょう?