diff --git a/lang/cpp26.md b/lang/cpp26.md index a352f3506..95b139430 100644 --- a/lang/cpp26.md +++ b/lang/cpp26.md @@ -165,7 +165,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通 - [`std::move_only_function`](/reference/functional/move_only_function.md)のコピー可能版として、[``](/reference/functional.md)に[`std::copyable_function`](/reference/functional/copyable_function.md)クラスを追加 - [`std::bind_front()`](/reference/functional/bind_front.md)と[`std::bind_back()`](/reference/functional/bind_back.md)に、非型テンプレート引数として関数を指定するオーバーロードを追加 - 関連して、非型テンプレート引数の関数オブジェクトを反転させられるよう、[`not_fn()`](/reference/functional/not_fn.md)に非型テンプレート引数版のオーバーロードを追加 -- [`std::reference_wrapper`](/reference/functional/reference_wrapper.md)に、比較演算子[`==`](/reference/functional/reference_wrapper/op_equal.md.nolink)と[`<=>`](/reference/functional/reference_wrapper/op_compare_3way.md.nolink)を追加 +- [`std::reference_wrapper`](/reference/functional/reference_wrapper.md)に、比較演算子[`==`](/reference/functional/reference_wrapper/op_equal.md)と[`<=>`](/reference/functional/reference_wrapper/op_compare_3way.md)を追加 ### 文字列 diff --git a/reference/functional/reference_wrapper.md b/reference/functional/reference_wrapper.md index 15a729151..3ee9bfab0 100644 --- a/reference/functional/reference_wrapper.md +++ b/reference/functional/reference_wrapper.md @@ -40,12 +40,26 @@ C++17からは、このクラスは[トリビアルコピー可能](/reference/t ## 非メンバ関数 +### ヘルパ関数 | 名前 | 説明 | 対応バージョン | |------|------|----------------| | [`ref`](ref.md) | `T&`に対応する`reference_wrapper`オブジェクトの生成 | C++11 | | [`cref`](cref.md) | `const T&`に対応する`reference_wrapper`オブジェクトの生成 | C++11 | +### 比較演算子 + +| 名前 | 説明 | 対応バージョン | +|------|------|----------------| +| [`operator==`](reference_wrapper/op_equal.md) | 等値比較 | C++26 | +| `operator!=` | 非等値比較 (`==`により使用可能) | C++26 | +| [`operator<=>`](reference_wrapper/op_compare_3way.md) | 三方比較 | C++26 | +| `operator<` | 左辺が右辺より小さいかを判定する (`<=>`により使用可能) | C++26 | +| `operator<=` | 左辺が右辺以下を判定する (`<=>`により使用可能) | C++26 | +| `operator>` | 左辺が右辺より大きいかを判定する (`<=>`により使用可能) | C++26 | +| `operator>=` | 左辺が右辺以上かを判定する (`<=>`により使用可能) | C++26 | + + ## 推論補助 | 名前 | 説明 | 対応バージョン | diff --git a/reference/functional/reference_wrapper/op_compare_3way.md b/reference/functional/reference_wrapper/op_compare_3way.md new file mode 100644 index 000000000..4560a7ed6 --- /dev/null +++ b/reference/functional/reference_wrapper/op_compare_3way.md @@ -0,0 +1,104 @@ +# operator<=> +* functional[meta header] +* std[meta namespace] +* reference_wrapper[meta class] +* function template[meta id-type] + +```cpp +friend constexpr synth-three-way-result + operator<=>(reference_wrapper x, + reference_wrapper y); // (1) C++26 + +friend constexpr synth-three-way-result + operator<=>(reference_wrapper x, + const T& y); // (2) C++26 + +friend constexpr synth-three-way-result + operator<=>(reference_wrapper x, + reference_wrapper y); // (3) C++26 +``` + +## 概要 +三方比較を行う。 + +- (1) : 同じ要素型の`reference_wrapper`同士を三方比較する +- (2) : `reference_wrapper`と要素型`T`を三方比較する +- (3) : `reference_wrapper`と`reference_wrapper`を三方比較する + +(2)と(3)はオペランドを左右で逆にしても使用できる。 + + +## テンプレートパラメータ制約 +- (3) : [`is_const_v`](/reference/type_traits/is_const.md)``が`false`であること + + +## 戻り値 +- (1) : + ```cpp + return synth-three-way(x.get(), y.get()); + ``` + * get()[link get.md] + +- (2) : + ```cpp + return synth-three-way(x.get(), y); + ``` + * get()[link get.md] + +- (3) : + ```cpp + return synth-three-way(x.get(), y.get()); + ``` + * get()[link get.md] + + +## 備考 +- この演算子により、以下の演算子が使用可能になる: + - `operator<` + - `operator<=` + - `operator>` + - `operator>=` + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + int x = 3; + int y = 3; + int z = 4; + + assert((std::ref(x) <=> std::ref(y)) == 0); + assert(std::ref(x) < std::ref(z)); + assert(std::ref(x) <= std::ref(z)); + assert(std::ref(z) > std::ref(x)); + assert(std::ref(z) >= std::ref(x)); + + assert((std::ref(x) <=> 3) == 0); + assert((3 <=> std::ref(x)) == 0); + + assert((std::ref(x) <=> std::cref(y)) == 0); + assert((std::cref(x) <=> std::ref(y)) == 0); +} +``` + +### 出力 +``` +``` + +## バージョン +### 言語 +- C++26 + +### 処理系 +- [Clang](/implementation.md#clang): 11.0 [mark verified] +- [GCC](/implementation.md#gcc): 10 [mark verified] +- [Visual C++](/implementation.md#visual_cpp): 2019 [mark verified] + + +## 参照 +- [P2944R3 Comparisons for `reference_wrapper`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2944r3.html) diff --git a/reference/functional/reference_wrapper/op_equal.md b/reference/functional/reference_wrapper/op_equal.md new file mode 100644 index 000000000..3828d6207 --- /dev/null +++ b/reference/functional/reference_wrapper/op_equal.md @@ -0,0 +1,99 @@ +# operator== +* functional[meta header] +* std[meta namespace] +* reference_wrapper[meta class] +* function template[meta id-type] + +```cpp +friend constexpr bool + operator==(reference_wrapper x, + reference_wrapper y); // (1) C++26 + +friend constexpr bool + operator==(reference_wrapper x, + const T& y); // (2) C++26 + +friend constexpr bool + operator==(reference_wrapper x, + reference_wrapper y); // (3) C++26 +``` + +## 概要 +等値比較を行う。 + +- (1) : 同じ要素型の`reference_wrapper`同士を等値比較する +- (2) : `reference_wrapper`と要素型`T`を等値比較する +- (3) : `reference_wrapper`と`reference_wrapper`を等値比較する + +(2)と(3)はオペランドを左右で逆にしても使用できる。 + + +## テンプレートパラメータ制約 +- (1) : 式`x.`[`get()`](get.md) `== y.`[`get()`](get.md)が妥当であり、その戻り値型が`bool`に変換可能であること +- (2) : 式`x.`[`get()`](get.md) `== y`が妥当であり、その戻り値型が`bool`に変換可能であること +- (3) : 式`x.`[`get()`](get.md) `== y.`[`get()`](get.md)が妥当であり、その戻り値型が`bool`に変換可能であること + + +## 戻り値 +- (1) : + ```cpp + return x.get() == y.get(); + ``` + * get()[link get.md] + +- (2) : + ```cpp + return x.get() == y; + ``` + * get()[link get.md] + +- (3) : + ```cpp + return x.get() == y.get(); + ``` + * get()[link get.md] + + +## 備考 +- この演算子により、以下の演算子が使用可能になる: + - `operator!=` + + +## 例 +```cpp example +#include +#include + +int main() +{ + int x = 3; + int y = 3; + + assert(std::ref(x) == std::ref(y)); + + assert(std::ref(x) == 3); + assert(3 == std::ref(x)); + + assert(std::ref(x) == std::cref(y)); + assert(std::cref(x) == std::ref(y)); +} +``` +* std::ref[link /reference/functional/ref.md] +* std::cref[link /reference/functional/cref.md] + +### 出力 +``` +``` + +## バージョン +### 言語 +- C++26 + +### 処理系 +- [Clang](/implementation.md#clang): 3.0 [mark verified] +- [GCC](/implementation.md#gcc): 4.4 [mark verified] +- [Visual C++](/implementation.md#visual_cpp): 2019 [mark verified] + + +## 参照 +- [P2944R3 Comparisons for `reference_wrapper`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2944r3.html)