Spec-Zone.ru › C++

operator-(std::common_iterator)

template< std::sized_sentinel_for<I> I2, std::sized_sentinel_for<I> S2 >
    requires std::sized_sentinel_for<S, I2>
friend constexpr std::iter_difference_t<I2>
    operator-( const common_iterator& x, const std::common_iterator<I2, S2>& y );
(начиная с C++20)

Вычисляет расстояние между итераторами и/или сентинелами, хранящимися в базовых объектах-членах std::variant var . Два сентинела считаются равными.

Пусть Ix — это x.var.index(), а Iy — это y.var.index():

  • Если Ix == 1 && Iy == 1 (то есть и x, и y хранят сентинелы), расстояние равно 0.
  • В противном случае расстояние равно std::get<Ix>(x.var) - std::get<Iy>(y.var).

Если x.var.valueless_by_exception() || y.var.valueless_by_exception() — это true, поведение не определено.

(до C++26)

Если x.var.valueless_by_exception() || y.var.valueless_by_exception() — это true:

  • Если реализация является защищённой, возникает нарушение контракта.
  • Если реализация не является защищённой, поведение не определено.
(начиная с C++26)

Этот шаблон функции не виден при обычном неквалифицированном или квалифицированном поиске и может быть найден только с помощью поиска с учётом аргументов, если std::common_iterator<I> является ассоциированным классом аргументов.

Параметры

x, y - адаптеры итераторов, для которых вычисляется разность

Возвращаемое значение

Расстояние между базовыми итераторами и/или сентинелами, как описано выше.

Пример

#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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 3574 C++20 variant был полностью constexpr (P2231R1), но common_iterator — нет также сделан constexpr

См. также

operator++operator++(int)
продвигает common_iterator
(функция-член общего назначения)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/common_iterator/operator-

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API