operator-(std::common_iterator)
From cppreference.com
< cpp | iterator | common iterator
| template< std::sized_sentinel_for<I> I2, std::sized_sentinel_for<I> S2 > requires std::sized_sentinel_for<S, I2> |
(C++20以降) | |
イテレータアダプタ間の距離を計算します。2つのセンチネルは等しいとみなされます。
var が std::common_iterator の基底となる std::variant メンバオブジェクトであるとすると、x または y のどちらかが無効である場合、つまり x.var.valueless_by_exception() || y.var.valueless_by_exception() が true の場合、動作は未定義です。
この関数テンプレートは、通常の 非修飾または 修飾ルックアップからは見えず、std::common_iterator<I> が引数に関連付けられたクラスである場合にのみ 引数依存名前探索によって見つけることができます。
目次 |
[編集] パラメータ
| x, y | - | 差を計算するイテレータアダプタ |
[編集] 戻り値
- 0 x.var が
Sオブジェクトを保持し、y.var がS2オブジェクトを保持する場合、すなわち両方がセンチネルを保持する場合。 - それ以外の場合は、alt_x - alt_y。ここで
alt_xとalt_yは、それぞれ x.var と y.var が保持する代替(2つのイテレータ、または1つのイテレータと1つのセンチネルのいずれか)です。
[編集] 例
このコードを実行
#include <algorithm> #include <iostream> #include <iterator> int main() { int a[]{0, 1, 2, 3, 4, 5}; using CI = std::common_iterator< std::counted_iterator<int*>, std::default_sentinel_t >; CI i1{std::counted_iterator{a + 1, 2}}; CI i2{std::counted_iterator{a, 3}}; CI s1{std::default_sentinel}; CI s2{std::default_sentinel}; std::cout << (s2 - s1) << ' ' << (i2 - i1) << ' ' << (i1 - s1) << '\n'; }
出力
0 -1 -2
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3574 | C++20 | variant は完全にconstexprでしたが(P2231R1)、 common_iterator はそうではありませんでした。 |
constexpr にもなりました。 |
[編集] 関連項目
common_iterator を前進させます(public member function) |