Skip to content

Commit 2846b08

Browse files
committed
vector / bitset : C++26でのswap関係の仕様変更に対応 (close #1571)
1 parent 89a5cc0 commit 2846b08

2 files changed

Lines changed: 29 additions & 0 deletions

File tree

reference/bitset/bitset/reference.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@ namespace std {
1616
CONSTEXPR ~reference() noexcept;
1717
CONSTEXPR reference& operator=(bool x) noexcept;
1818
CONSTEXPR reference& operator=(const reference&) noexcept;
19+
constexpr const reference& operator=(bool x) const noexcept; // C++26
1920
CONSTEXPR bool operator~() const noexcept;
2021
CONSTEXPR operator bool() const noexcept;
2122
CONSTEXPR reference& flip() noexcept;
23+
24+
friend constexpr void swap(reference x, reference y) noexcept; // C++26
25+
friend constexpr void swap(reference x, bool& y) noexcept; // C++26
26+
friend constexpr void swap(bool& x, reference y) noexcept; // C++26
2227
};
2328
};
2429
}
@@ -30,18 +35,30 @@ namespace std {
3035
3136
C++23から`bitset::reference`全メンバ関数への`constexpr`指定が行われる。
3237
38+
C++26から、`const`修飾された`*this`に対する`bool`からの代入演算子と、ADLで見つかる非メンバ`swap`関数が追加され、[`vector<bool>::reference`](/reference/vector/vector.md)とインタフェースが統一された。
39+
3340
3441
### メンバ関数
3542
3643
| 名前 | 説明 | 対応バージョン |
3744
|----------------------------|----------------------------------------------------------|-------|
3845
| `operator=(bool x)` | ビット情報を書き換える | |
3946
| `operator=(const reference&)` | ビット情報をコピーする | |
47+
| `operator=(bool x) const` | `const`な`*this`のビット情報を書き換える | C++26 |
4048
| `operator~()` | 反転したビットを取得する | |
4149
| `operator bool()` | `bool`型に変換する | |
4250
| `flip()` | ビットを反転させる | |
4351
4452
53+
### 非メンバ関数
54+
55+
| 名前 | 説明 | 対応バージョン |
56+
|------|------|----------------|
57+
| `swap(reference x, reference y)` | 2つの参照先のビットを入れ替える | C++26 |
58+
| `swap(reference x, bool& y)` | 参照先のビットと`bool`を入れ替える | C++26 |
59+
| `swap(bool& x, reference y)` | `bool`と参照先のビットを入れ替える | C++26 |
60+
61+
4562
## 例
4663
```cpp example
4764
#include <cassert>
@@ -75,3 +92,5 @@ int main()
7592

7693
## 参照
7794
- [P2417R2 A more constexpr bitset](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2417r2.pdf)
95+
- [P3612R1 Harmonize proxy-reference operations (LWG 3638 and 4187)](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3612r1.html)
96+
- C++26で、`const`修飾された`*this`に対する`bool`からの代入演算子と、ADLで見つかる非メンバ`swap`関数が追加された

reference/vector/vector.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ namespace std {
181181
182182
C++23には`vector<bool>::iterator`が出力イテレータとなるために、`vector<bool>::reference`が`const`修飾を持つ`bool`からの代入演算子が追加され、[`indirectly_writable<vector<bool>::iterator,` `bool>`](/reference/iterator/indirectly_writable.md)がモデルを満たすようになった。
183183
184+
C++26では、ADLで見つかる非メンバ`swap`関数が追加され、[`bitset<N>::reference`](/reference/bitset/bitset/reference.md)とインタフェースが統一された。これにあわせて、従来の`static`メンバ関数版の`swap`は非推奨となった。
185+
184186
```cpp
185187
class vector<bool>::reference {
186188
friend class vector;
@@ -193,6 +195,12 @@ public:
193195
constexpr reference& operator=(const reference& x) noexcept; // vector<bool>のビットからの代入
194196
constexpr const reference& operator=(bool x) const noexcept; // *thisがconst時のboolからの代入(C++23)
195197
constexpr void flip() noexcept; // ビットの反転
198+
199+
friend constexpr void swap(reference x, reference y) noexcept; // 2つのビットの交換(C++26)
200+
friend constexpr void swap(reference x, bool& y) noexcept; // ビットとboolの交換(C++26)
201+
friend constexpr void swap(bool& x, reference y) noexcept; // boolとビットの交換(C++26)
202+
203+
static constexpr void swap(reference x, reference y) noexcept; // ビットの交換(C++26から非推奨)
196204
};
197205
```
198206

@@ -447,3 +455,5 @@ int main()
447455
- [N4510 Minimal incomplete type support for standard containers, revision 4](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4510.html)
448456
- [P2286R8 Formatting Ranges](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2286r8.html)
449457
- C++23から、Range・コンテナ、`pair``tuple`のフォーマット出力、および文字・文字列のデバッグ指定 (`"?"`) が追加された
458+
- [P3612R1 Harmonize proxy-reference operations (LWG 3638 and 4187)](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3612r1.html)
459+
- C++26で、`vector<bool>::reference`にADLで見つかる非メンバ`swap`関数が追加され、従来の`static`メンバ関数版`swap`が非推奨となった

0 commit comments

Comments
 (0)