萌えハッカーニュースリーダー

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

出典: https://www.sandordargo.com/blog/2025/10/01/cpp26-optional-of-reference
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、それはコンパイルエラーです。

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

Search