std::ranges...operatorbool(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– NAME πŸ’–

std::ranges::view_interface::operatorbool β€” std::ranges::view_interface::operatorbool

okay so this is the C++ Standard Libary manual page (yes, the header spells it β€œLibary”, and we’re keeping that energy) for the std::ranges::view_interface::operator bool situation. It’s the default little member that lets a view answer a contextual bool question about being non-empty, bestie. πŸ’…

πŸ¦‹ Synopsis πŸ¦‹

bestie, the signatures are literally these, and both are (since C++20):

constexpr explicit operator bool() requires /* see below */;

(1) (since C++20)

constexpr explicit operator bool() const requires /* see below */;

(2) (since C++20)

The default implementation of the operator bool member function checks whether the view is non-empty. It makes the derived type contextually convertible to bool. No cap. ✨

  1. Let derived be static_cast<D&>(*this). The expression in the requires-clause is equal to requires { ranges::empty(derived); }, and the function body is equivalent to return !ranges::empty(derived);.
  2. Same as (1), except that derived is static_cast<const D&>(*this).

πŸŽ€ Parameters πŸŽ€

(none) β€” literally no parameters, she’s lowkey simple like that. πŸ™ˆ

🌈 Return value 🌈

false if the value of the derived type is empty (determined by std::ranges::empty), true otherwise. periodt. πŸ’–

🧚 Notes 🧚

In C++20, no type derived from std::ranges::view_interface in the standard library provides their own operator bool. Almost all of these types use the default implementation.

A notable exception is std::ranges::basic_istream_view. For its iterator type never satisfies forward_iterator, the view cannot use the inherited operator bool.

bestie, that exception is important: std::ranges::basic_istream_view cannot use the inherited operator bool β€” the note says its iterator type never satisfies forward_iterator. 🫢

πŸ”₯ Example πŸ”₯

// Run this code β€” bestie, go off:

#include <array>
#include <iostream>
#include <ranges>

int main()
{
    const std::array ints {0, 1, 2, 3, 4};
    auto odds = ints | std::views::filter([](int i) { return 0 != i %
       2; });
    auto negs = ints | std::views::filter([](int i) { return i < 0; });
    std::cout << std::boolalpha
              << "Has odd numbers: " << (!!odds) << ' ' << '\n'
              << "Has negative numbers: " << (!!negs) << ' ' << '\n';
}

🌸 Output 🌸

Has odd numbers: true
Has negative numbers: false

πŸ‘‘ See also πŸ‘‘

  • ranges::empty β€” checks whether a range is empty. (C++20) (customization point object)
  • empty β€” returns whether the derived view is empty. Provided if it satisfies sized_range or forward_range. (C++20) (public member function)
  • empty β€” checks whether the container is empty. (C++17) (function template)

xoxo, your C++ Standard Libary bestie πŸ’– β€” source: http://cppreference.com; version/date: 2024.06.10; page: std::ranges...operatorbool(3).

πŸ“¦ where this page comes from