std::ranges...tream_view,(3)

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

πŸ’– std::ranges...tream_view,(3) πŸ’–

okay bestie, this is the std::ranges...tream_view,(3) page from the C++ Standard Libary manual β€” yes, that's the manual name, typo and all, no cap. It's giving stream-view realness, and we're gonna get through every detail together. πŸ¦‹


🌸 NAME 🌸

The names this page is serving are:

  • std::ranges::views::istream
  • std::ranges::basic_istream_view
  • std::ranges::istream_view

And the original NAME line also has a dash and repeats those three names, so here's the full cast exactly as listed:

std::ranges::views::istream,std::ranges::basic_istream_view,std::ranges::istream_view,
-
std::ranges::views::istream,std::ranges::basic_istream_view,std::ranges::istream_view,

✨ Synopsis ✨

Defined in header <ranges>.

template< std::movable Val, class CharT, class Traits =
std::char_traits<CharT> >

    requires std::default_initializable<Val> &&
             /*stream-extractable*/<Val,CharT,Traits>
(1) (since C++20)
class basic_istream_view

    : public
ranges::view_interface<basic_istream_view<Val,CharT,Traits>>
Helper templates
template< class Val >
(2) (since C++20)
using istream_view = ranges::basic_istream_view<Val, char>;
template< class Val >
(3) (since C++20)
using wistream_view = ranges::basic_istream_view<Val, wchar_t>;
Customization point objects
namespace views {

    template< class T >
(4) (since C++20)
    inline constexpr /*unspecified*/ istream = /*unspecified*/;

}
Helper concepts
template< class Val, class CharT, class Traits >

concept /*stream-extractable*/ =
(exposition
       requires(std::basic_istream<CharT,Traits>& is, Val& t) {
(5) only*)
           is >> t;

       };
  • 1) β€” A range factory that generates a sequence of elements by repeatedly calling operator>>.
  • 2,3) β€” Convenience alias templates for character types char and wchar_t.
  • 4) β€” views::istream<T>(e) is expression-equivalent to (has the same effect as) ranges::basic_istream_view<T, typename U::char_type, typename U::traits_type>(e) for any suitable subexpressions e, where U is std::remove_reference_t<decltype(e)>. The program is ill-formed if U is not both publicly and unambiguously derived from std::basic_istream<typename U::char_type, typename U::traits_type>, which may result in a substitution failure.
  • 5) β€” The exposition-only concept /*stream-extractable*/<Val,CharT,Traits> is satisfied when lvalue of Val can be extracted from lvalue of std::basic_istream<CharT,Traits>.

The iterator type of basic_istream_view is move-only: it does not meet the LegacyIterator requirements, and thus does not work with pre-C++20 algorithms.


πŸŽ€ Member functions πŸŽ€

  • constructor β€” constructs a basic_istream_view (public member function)
  • begin β€” returns an iterator (public member function)
  • end β€” returns std::default_sentinel (public member function)

Inherited from std::ranges::view_interface:

  • (none) β€” although basic_istream_view is derived from std::ranges::view_interface, it cannot use any of inherited member functions.

🌟 std::ranges::basic_istream_view::basic_istream_view 🌟

constexpr explicit
(since C++20)
    basic_istream_view( std::basic_istream<CharT, Traits>& stream );

Initializes the stored pointer to stream with std::addressof(stream), and value-initializes the stored value of Val.

🌟 std::ranges::basic_istream_view::begin 🌟

constexpr auto begin();  (since C++20)

Equivalent to *stream_ >> value_; return /*iterator*/{*this};, where stream_ is the stored pointer to stream and value_ is the stored value of Val.

🌟 std::ranges::basic_istream_view::end 🌟

constexpr std::default_sentinel_t end() const noexcept;  (since C++20)

Equivalent to return std::default_sentinel;.


πŸ’… Nested classes πŸ’…

  • iterator β€” the iterator type of basic_istream_view (C++20) (exposition-only member class*)

πŸ“ Example πŸ“

// Run this code

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <ranges>
#include <sstream>
#include <string>

int main()
{
    auto words = std::istringstream{"today is yesterday’s tomorrow"};
    for (const auto& s : std::views::istream<std::string>(words))
        std::cout << std::quoted(s, '/') << ' ';
    std::cout << '\n';

    auto floats = std::istringstream{"1.1  2.2\t3.3\v4.4\f55\n66\r7.7
       8.8"};
    std::ranges::copy(
        std::views::istream<float>(floats),
        std::ostream_iterator<float>{std::cout, ", "}
    );
    std::cout << '\n';
}

Output:

/today/ /is/ /yesterday’s/ /tomorrow/
1.1, 2.2, 3.3, 4.4, 55, 66, 7.7, 8.8,

🧚 Defect reports 🧚

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

  • P2325R3 β€” applied to C++20; behavior as published: default constructor was provided as view; correct behavior: removed along with the requirement must be default_initializable.
  • LWG 3568 β€” applied to C++20; behavior as published: P2325R3 accidentally made the stored value default-initialized; correct behavior: restored to value-initialization.
  • P2432R1 β€” applied to C++20; behavior as published: ranges::istream_view was a function template and customization point objects did not follow the naming convention; correct behavior: made an alias template; added.

🌈 See also 🌈

  • istream_iterator β€” input iterator that reads from std::basic_istream (class template)

okay that's the whole page, bestie πŸ’– β€” source/version: http://cppreference.com; date: 2024.06.10. Mwah πŸ’‹

πŸ“¦ where this page comes from