// expected<cv void, E>部分特殊化
template<class T2, class E2> requires is_void_v<T2>
friend constexpr bool operator==(const expected& x, const expected<T2, E2>& y); // (1)
template<class E2>
friend constexpr bool operator==(const expected& x, const unexpected<E2>& e); // (2)
// (2)により、下記オーバーロードが使用可能になる
template<class E2>
friend constexpr bool operator==(const unexpected<E2>& e, const expected& x); // (3)
概要
- (1) :
expected
オブジェクト同士の等値比較を行う。 - (2), (3) :
expected
オブジェクトとエラー値の等値比較を行う。
適格要件
- (1) : 式
x.error() == y.error()
が適格であり、その結果をbool
へ変換可能であること。 - (2), (3) : 式
x.error() == e.error()
が適格であり、その結果をbool
へ変換可能であること。
戻り値
- (1) : 次の値を返す
x.has_value()
とy.has_value()
が異なるとき、false
- そうでなければ、
x.has_value() || static_cast<bool>(x.error() == y.error())
- (2), (3) :
!x.has_value() && static_cast<bool>(x.error() == e.error())
例
#include <cassert>
#include <expected>
int main()
{
std::expected<void, long> x1;
std::expected<void, short> y1;
std::expected<void, long> x2 = std::unexpected{1};
std::expected<void, short> y2 = std::unexpected{1};
// (1)
assert(x1 == y1);
assert(x2 == y2);
assert(not (x1 == y2));
assert(not (x2 == y1));
// (2), (3)
assert(x2 == std::unexpected{1});
assert(std::unexpected{1} == x2);
}
出力
バージョン
言語
- C++23
処理系
- Clang: 16.0 ✅
- GCC: 12.1 ✅
- ICC: ??
- Visual C++: ??