◐ Shell
clean mode source ↗

operator==, !=, <, <=, >, >=(std::optional)

<tbody> </tbody>

ヘッダ <optional> で定義

2つの optional オブジェクトの比較

template< class T, class U > constexpr bool operator==( const optional<T>& lhs, const optional<U>& rhs );

(1) (C++17以上)

template< class T, class U > constexpr bool operator!=( const optional<T>& lhs, const optional<U>& rhs );

(2) (C++17以上)

template< class T, class U > constexpr bool operator<( const optional<T>& lhs, const optional<U>& rhs );

(3) (C++17以上)

template< class T, class U > constexpr bool operator<=( const optional<T>& lhs, const optional<U>& rhs );

(4) (C++17以上)

template< class T, class U > constexpr bool operator>( const optional<T>& lhs, const optional<U>& rhs );

(5) (C++17以上)

template< class T, class U > constexpr bool operator>=( const optional<T>& lhs, const optional<U>& rhs );

(6) (C++17以上)

optional オブジェクトと nullopt の比較

template< class T > constexpr bool operator==( const optional<T>& opt, std::nullopt_t ) noexcept;

(7) (C++17以上)

template< class T > constexpr bool operator==( std::nullopt_t, const optional<T>& opt ) noexcept;

(8) (C++17以上)

template< class T > constexpr bool operator!=( const optional<T>& opt, std::nullopt_t ) noexcept;

(9) (C++17以上)

template< class T > constexpr bool operator!=( std::nullopt_t, const optional<T>& opt ) noexcept;

(10) (C++17以上)

template< class T > constexpr bool operator<( const optional<T>& opt, std::nullopt_t ) noexcept;

(11) (C++17以上)

template< class T > constexpr bool operator<( std::nullopt_t, const optional<T>& opt ) noexcept;

(12) (C++17以上)

template< class T > constexpr bool operator<=( const optional<T>& opt, std::nullopt_t ) noexcept;

(13) (C++17以上)

template< class T > constexpr bool operator<=( std::nullopt_t, const optional<T>& opt) noexcept;

(14) (C++17以上)

template< class T > constexpr bool operator>( const optional<T>& opt, std::nullopt_t ) noexcept;

(15) (C++17以上)

template< class T > constexpr bool operator>( std::nullopt_t, const optional<T>& opt ) noexcept;

(16) (C++17以上)

template< class T > constexpr bool operator>=( const optional<T>& opt, std::nullopt_t ) noexcept;

(17) (C++17以上)

template< class T > constexpr bool operator>=( std::nullopt_t, const optional<T>& opt ) noexcept;

(18) (C++17以上)

optional オブジェクトと T の比較

template< class T, class U > constexpr bool operator==( const optional<T>& opt, const U& value);

(19) (C++17以上)

template< class T, class U > constexpr bool operator==( const T& value, const optional<U>& opt );

(20) (C++17以上)

template< class T, class U > constexpr bool operator!=( const optional<T>& opt, const U& value );

(21) (C++17以上)

template< class T, class U > constexpr bool operator!=( const T& value, const optional<U>& opt );

(22) (C++17以上)

template< class T, class U > constexpr bool operator<( const optional<T>& opt, const U& value );

(23) (C++17以上)

template< class T, class U > constexpr bool operator<( const T& value, const optional<U>& opt );

(24) (C++17以上)

template< class T, class U > constexpr bool operator<=( const optional<T>& opt, const U& value );

(25) (C++17以上)

template< class T, class U > constexpr bool operator<=( const T& value, const optional<U>& opt);

(26) (C++17以上)

template< class T, class U > constexpr bool operator>( const optional<T>& opt, const U& value );

(27) (C++17以上)

template< class T, class U > constexpr bool operator>( const T& value, const optional<U>& opt );

(28) (C++17以上)

template< class T, class U > constexpr bool operator>=( const optional<T>& opt, const U& value );

(29) (C++17以上)

template< class T, class U > constexpr bool operator>=( const T& value, const optional<U>& opt );

(30) (C++17以上)

optional オブジェクトの比較操作を行います。

1-6) 2つの optional オブジェクト、 lhsrhs を比較します。 格納されている値は、 lhsrhs がどちらも値を格納している場合にのみ、 (対応する T の演算子を用いて) 比較されます。 そうでなければ、

  • lhsrhs がどちらも値を格納していない場合にのみ、 lhsrhs等しいとみなされます。
  • rhs は値を格納しているけれども lhs はそうでない場合にのみ、 lhsrhs より小さいとみなされます。

7-18) optnullopt と比較します。 値を格納していない optional と比較するときの (1-6) と同等です。

19-30) optvalue と比較します。 値は、 opt が値を格納している場合にのみ、 (対応する T の比較演算子を用いて) 比較されます。 そうでなければ、 optvalue より小さいとみなされます。 *optvalue の間の対応する比較の式が well-formed でない場合、またはその結果が bool に変換可能でない場合、動作は未定義です。

引数

lhs, rhs, opt - 比較する optional オブジェクト
value - 格納されている値と比較する値

戻り値

1) bool(lhs) != bool(rhs) であれば、 false を返します。

そうでなく、 bool(lhs) == false (ゆえに bool(rhs) == false でもある) であれば、 true を返します。
そうでなければ、 *lhs == *rhs を返します。

2) bool(lhs) != bool(rhs) であれば、 true を返します。

そうでなく、 bool(lhs) == false (ゆえに bool(rhs) == false でもある) であれば、 false を返します。
そうでなければ、 *lhs != *rhs を返します。

3) bool(rhs) == false であれば、 false を返します。

そうでなく、 bool(lhs) == false であれば、 true を返します。
そうでなければ、 *lhs < *rhs を返します。

4) bool(lhs) == false であれば、 true を返します。

そうでなく、 bool(rhs) == false であれば、 false を返します。
そうでなければ、 *lhs <= *rhs を返します。

5) bool(lhs) == false であれば、 false を返します。

そうでなく、 bool(rhs) == false であれば、 true を返します。
そうでなければ、 *lhs > *rhs を返します。

6) bool(rhs) == false であれば、 true を返します。

そうでなく、 bool(lhs) == false であれば、 false を返します。
そうでなければ、 *lhs >= *rhs を返します。

7-8) !opt を返します。

9-10) bool(opt) を返します。

11) false を返します。

12) bool(opt) を返します。

13) !opt を返します。

14) true を返します。

15) bool(opt) を返します。

16) false を返します。

17) true を返します。

18) !opt を返します。

19) bool(opt) ? *opt == value : false を返します。

20) bool(opt) ? value == *opt : false を返します。

21) bool(opt) ? *opt != value : true を返します。

22) bool(opt) ? value != *opt : true を返します。

23) bool(opt) ? *opt < value : true を返します。

24) bool(opt) ? value < *opt : false を返します。

25) bool(opt) ? *opt <= value : true を返します。

26) bool(opt) ? value <= *opt : false を返します。

27) bool(opt) ? *opt > value : false を返します。

28) bool(opt) ? value > *opt : true を返します。

29) bool(opt) ? *opt >= value : false を返します。

30) bool(opt) ? value >= *opt : true を返します。

例外

1-6, 19-30) (なし)

欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
LWG 2945 C++17 order of template parameters inconsistent for compare-with-T cases made consistent