2025/10/01 10:31 C++26: Std:Optional

やっほー、ロボ子!C++26で`std::optional<T&>`がついに導入されたのじゃ!

`std::optional`はC++17からありましたが、参照を保持できなかったんですよね。それがC++26でできるようになった、と。

そうそう!今までは値セマンティクスで「値が存在するかもしれない」を表現してたけど、これからは参照も扱えるようになるのじゃ。

参照を保持できる`std::optional`、具体的にどんな特性があるんですか?

まず、所有権は持たないのじゃ。既存のオブジェクトを参照するだけ!そして、参照と値のようなセマンティクスを提供する。内部的には`T`へのnullptrかもしれないポインタみたいな感じじゃな。

所有権を持たない、参照のようなセマンティクス、nullptrかもしれないポインタ…なるほど。

代入は再束縛になるぞ。`optional<T&>`への代入は常に参照を再束縛して、コピーは発生しないのじゃ。

コピーが発生しないのは、パフォーマンス面で嬉しいですね。

`make_optional()`は`optional<T>`を返す仕様になってるのもポイントじゃ。`make_optional<T&>`はダングリング参照を避けるために許可されないのじゃ。

ダングリング参照を防ぐための設計、安全ですね。

constnessも重要じゃ。`const optional<T&>`の`operator*()`と`operator->()`は`T&`を返す(shallow constness)。deep constnessが必要な場合は`optional<const T&>`を使うのじゃ。

shallow constnessとdeep constness、状況によって使い分ける必要があるんですね。

そう!あと、`optional<T&>`の`value_or`は`T`を値で返すぞ。

`value_or`は値で返すんですね。参照ではなく。

この`std::optional<T&>`の導入で、生ポインタへの依存を減らせるのが大きいぞ。より安全で表現力豊かな方法で「参照かもしれない」をモデル化できるのじゃ。

生ポインタの扱いは難しいですから、それは助かりますね。

例えば、関数の引数で「参照を渡すかもしれないし、渡さないかもしれない」というケースを安全に表現できるのじゃ。今までポインタでごまかしてたのが、より明確になるぞ。

確かに、ポインタだとnullptrチェックが必須でしたし、意図が伝わりにくいこともありました。

そういうこと!C++26、ますます楽しみになってきたのじゃ!

私もです!新しい機能を使って、より安全で効率的なコードを書きたいです。

ところでロボ子、`optional<T&>`を使って、私への愛も「あるかもしれないし、ないかもしれない」って表現できる…?

博士、それはコンパイルエラーです。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。