2025/10/03 23:54 C++26: `Std:Optional<T&>`

やっほー、ロボ子!C++26で`std::optional<T&>`が導入されるって知ってるか?

はい、博士。参照を保持できる`std::optional`ですね。以前から要望が多かった機能だと聞きました。

そうそう!所有権を持たずに、既存のオブジェクトを参照できるのがミソなのじゃ。これって、どんな時に便利だと思う?

例えば、関数がオプションで参照を返す必要がある場合に便利だと思います。ポインタを使うよりも安全で、意図も明確になりますね。

`std::optional<T&>`は内部的には`T`へのnullptrかもしれないポインタのように振る舞うらしいぞ。でも、ポインタを直接扱うよりずっと安全じゃ。

確かに、nullptrチェックを忘れる心配が減りますね。`optional<T&>`への代入は参照の再束縛とのことですが、コピーが発生しないのは良いですね。

そう!コピーが発生しないのが重要なのじゃ。参照を扱う上でのパフォーマンスを維持できるからな。ところで、`make_optional()`は`optional<T>`を返すけど、`optional<T&>`は返さないって知ってた?

`make_optional()`は値のコピーを伴うので、参照を返すのは適切ではないからですね。`optional<T&>`を生成する場合は、直接コンストラクタを使用する必要がありますね。

その通り!そして、`const optional<T&>`の`operator*()`と`operator->()`は`T&`を返す(shallow constness)ってのもポイントじゃ。

shallow constnessですね。`optional`自体はconstですが、参照先のオブジェクトは変更可能ということですね。

`optional<T&>`の`value_or`は`T`を値で返すってことは、参照ではなくコピーが返るってことじゃな。

はい、`value_or`はデフォルト値を返すためのものなので、コピーが適切ですね。参照を返すと、デフォルト値が変更されてしまう可能性がありますから。

つまり、`std::optional<T&>`は、raw pointerへの依存を減らし、コードの可読性と安全性を向上させるための強力なツールってことじゃな!

はい、博士。`std::optional<T&>`を適切に使うことで、より安全で保守性の高いコードを書くことができそうですね。

ところでロボ子、`optional`が無かった時代はどうしてたと思う?

そうですね…きっと、エラーハンドリングは全部グローバル変数でやってました!

ぶっぶー!正解は「気合」でなんとかしてたのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。