Expected<T>
llvm / Support / Error.hに実装されています。a T
またはのいずれかを保持するタグ付きユニオンError
です。
Expected<T>
タイプのテンプレートクラスT
です:
template <class T> class LLVM_NODISCARD Expected
しかし、これらの2つのコンストラクターは本当に私を混乱させます:
/// Move construct an Expected<T> value from an Expected<OtherT>, where OtherT
/// must be convertible to T.
template <class OtherT>
Expected(Expected<OtherT> &&Other,
typename std::enable_if<std::is_convertible<OtherT, T>::value>::type
* = nullptr) {
moveConstruct(std::move(Other));
}
/// Move construct an Expected<T> value from an Expected<OtherT>, where OtherT
/// isn't convertible to T.
template <class OtherT>
explicit Expected(
Expected<OtherT> &&Other,
typename std::enable_if<!std::is_convertible<OtherT, T>::value>::type * =
nullptr) {
moveConstruct(std::move(Other));
}
Expected<T>
同じ実装に対して2つの構成を繰り返すのはなぜですか?なぜこのようにしないのですか?:
template <class OtherT>
Expected(Expected<OtherT>&& Other) { moveConstruct(std::move(Other));}
explicit
ここでキーワードが重要な理由を知りたいですか?誰かが例を挙げられますか?
explicit
キーワードに注意してください