std::expected(続々)ZennYae🐡std::expected(続々)2022/04/12に公開2022/04/16C++techこの記事は以前書いていたstd::expected(続)の続きです。Brandの実装の中を見ていきます。ライフタイムを管理するオブジェクトである。ためのストレージを含むこともできます。含まれるオブジェクトは期待されるオブジェクトが初期化された後には初期化されてはならず、期待されるオブジェクトが破壊される前に破壊されてはならない。内包されたオブジェクトの初期化状態は、期待されるオブジェクトによって追跡されます。わからないのでいくつかに分けて見ていきます。static_assertコンパイル時Assertです。条件を満たさない型が渡されるとコンパイルエラーにします。渡された型はexpectedが扱う型としては契約違反と親切に教えてくれる部分です。参照型をEとして渡すことは禁止!!!参照型を渡してはいけないのは?unionに参照型を渡すことはできないためです。[1]unexpect_t型をTとして渡すことは禁止なのは?unexpect_tはT=Eの場合にコンストラクタ引数が重複しないためにEのために作ったクラスです。[2]in_place_t型をTとして渡すことは禁止なのは?in_place_t型は実は意味があるクラスではなく、初期化するコンストラクタを選択するためのタグで意味がないクラスのため禁止されています。optionalクラス内でstring型のオブジェクトを生成する。*/}private継承private継承はほぼ使うときはないですが外部に公開されない継承ということを利用して、"基底クラスの実装を再利用すること"を目的に使われます。ここでは、T,Eのコンストラクタ、コピーコンストラクタ、代入演算子、move演算子、move代入演算子の実装を切り替えることを実現しています。テンプレートメタプログラミングではコンパイル時にコードが実体化されるため、Tがデフォルトコンストラクタを持っていないのにデフォルトコンストラクタを呼ぶようなコードが生成されるとコンパイルエラーになってしまいます。いったことを防ぐためにprivateな基底クラスをテンプレートの特殊化を使って実装を分けるということをしています。コンストラクタ、コピーコンストラクタ、代入演算子、move演算子、move代入演算子、デストラクタはご存じのとうりデフォルトで勝手に作られるのですが、デフォルトとユーザー定義のものでは扱いが違います。以下のようにコメントを追加することで意図がわかりやすくなったと思います。応じて、条件付きでコピー/ムーブコンストラクタを削除します。コンストラクタが削除されることを保証します。↩︎Yaeバッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。