Spec-Zone.ru › C++

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

constexpr bool empty()
    requires ranges::sized_range<D> || ranges::forward_range<D>;
(1) (since C++20)
constexpr bool empty() const
    requires ranges::sized_range<const D> || ranges::forward_range<const D>;
(2) (since 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
(since C++23)

Хотя 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++.

DR Применено к Поведение, как опубликовано Правильное поведение
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/w/cpp/ranges/view_interface/empty

Spec-Zone.ru

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