Spec-Zone.ru › C++

std::ranges::view_interface<D>::empty

constexpr bool empty()
    requires ranges::sized_range<D> || ranges::forward_range<D>;
(1) (начиная с C++20)
constexpr bool empty() const
    requires ranges::sized_range<const D> || ranges::forward_range<const D>;
(2) (начиная с C++20)

Реализация по умолчанию функции-члена empty() проверяет, является ли размер объекта производного типа 0 (если это допустимо), или сравниваются ли итератор начала и сторожевой объект как равные.

1) Пусть derived — ссылка, привязанная к static_cast<D&>(*this). Эквивалентно return ranges::size(derived) == 0;, если D удовлетворяет требованиям sized_range. В противном случае эквивалентно return ranges::begin(derived) == ranges::end(derived);.
2) То же, что и (1), за исключением того, что derived — static_cast<const D&>(*this).

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

true, если размер объекта производного типа равен 0 (если D удовлетворяет требованиям std::ranges::sized_range) или его итератор начала и сторожевой объект сравниваются как равные; в противном случае — false.

Примечания

Следующие производные типы могут использовать реализацию empty по умолчанию:

  • std::ranges::common_view
  • std::ranges::drop_view
  • std::ranges::drop_while_view
  • std::ranges::elements_view
  • std::ranges::filter_view
  • std::ranges::join_view
  • std::ranges::lazy_split_view
  • std::ranges::reverse_view
  • std::ranges::single_view
  • std::ranges::split_view
  • std::ranges::take_view
  • std::ranges::take_while_view
  • std::ranges::transform_view
  • std::ranges::adjacent_transform_view
  • std::ranges::adjacent_view
  • std::ranges::as_const_view
  • std::ranges::as_rvalue_view
  • std::ranges::cartesian_product_view
  • std::ranges::chunk_view
  • std::ranges::chunk_by_view
  • std::ranges::join_with_view
  • std::ranges::repeat_view
  • std::ranges::slide_view
  • std::ranges::stride_view
  • std::ranges::zip_view
  • std::ranges::zip_transform_view
(начиная с C++23)
  • std::ranges::as_input_view
  • std::ranges::cache_latest_view
  • std::ranges::concat_view
(начиная с C++26)

Хотя std::ranges::basic_istream_view наследуется от std::ranges::view_interface и не объявляет функцию-член empty(), он не может использовать реализацию по умолчанию, поскольку никогда не удовлетворяет ни std::ranges::sized_range, ни std::ranges::forward_range.

Пример

#include <array>
#include <ranges>

int main()
{
    constexpr std::array a{0, 1, 2, 3, 4};
    static_assert(!std::ranges::single_view(a).empty());
    static_assert((a | std::views::take(0)).empty());
    static_assert(!(a | std::views::take(5)).empty());
    static_assert((a | std::views::drop(5)).empty());
    static_assert(!(a | std::views::drop(3)).empty());
    static_assert(std::views::iota(0,0).empty());
    static_assert(!std::views::iota(0).empty());
}

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применяется к Опубликованное поведение Исправленное поведение
LWG 3715 C++20 empty() поддерживал только типы forward_range Также поддерживаются типы только с sized_range

См. также

empty
(C++17)
проверяет, пуст ли контейнер
(шаблон функции)
ranges::empty
(C++20)
проверяет, пуст ли диапазон
(объект-точка настройки)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/view_interface/empty

Spec-Zone.ru

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