Scroll to navigation

std::ranges::view_interface::empty(3) C++ Standard Libary std::ranges::view_interface::empty(3)

NAME

std::ranges::view_interface::empty - std::ranges::view_interface::empty

Synopsis


constexpr bool empty() (1) (since C++20)
requires ranges::sized_range<D> || ranges::forward_range<D>;
constexpr bool empty() const
requires ranges::sized_range<const D> || (2) (since C++20)
ranges::forward_range<const D>;


The default implementation of empty() member function checks whether the object of
the derived type's size is 0 (if valid), or whether the beginning iterator and the
sentinel compare equal.


1) Let derived be a reference bound to static_cast<D&>(*this). Equivalent to return
ranges::size(derived) == 0; if D satisfies sized_range. Otherwise, equivalent to
return ranges::begin(derived) == ranges::end(derived);.
2) Same as (1), except that derived is static_cast<const D&>(*this).

Parameters


(none)

Return value


true if the size of the object of the derived type is 0 (if D satisfies
std::ranges::sized_range), or its beginning iterator and the sentinel compare equal,
false otherwise.

Notes


Following derived types may use the default implementation of 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 (since C++23)
* 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


Although std::ranges::basic_istream_view inherits from std::ranges::view_interface
and does not declare the empty() member function, it cannot use the default
implementation, because it never satisfies neither std::ranges::sized_range nor
std::ranges::forward_range.

Example

// Run this code


#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());
}


Defect reports


The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.


DR Applied to Behavior as published Correct behavior
LWG 3715 C++20 empty() only supported sized_range-only types are also
forward_range types supported

See also


empty checks whether the container is empty
(C++17) (function template)
ranges::empty checks whether a range is empty
(C++20) (customization point object)

2024.06.10 http://cppreference.com