# std::ranges::views::istream, std::ranges::basic_istream_view, std::ranges::istream_view, std::ranges::wistream_view

< cpp‎ | ranges

定义于头文件 `<ranges>` |  |
template< std::movable Val, class CharT, class Traits = std::char_traits<CharT> > requires std::default_initializable<Val> && /*stream-extractable*/<Val,CharT,Traits> class basic_istream_view : public ranges::view_interface<basic_istream_view<Val,CharT,Traits>> | (1) | (C++20 起)
辅助模板 |  |
template< class Val > using istream_view = ranges::basic_istream_view<Val, char>; | (2) | (C++20 起)
template< class Val > using wistream_view = ranges::basic_istream_view<Val, wchar_t>; | (3) | (C++20 起)
定制点对象 |  |
template< class T > inline constexpr /*unspecified*/ istream = /*unspecified*/; | (4) | (C++20 起)
辅助概念 |  |
template< class Val, class CharT, class Traits > concept /*stream-extractable*/ = requires(std::basic_istream<CharT,Traits>& is, Val& t) { is >> t; }; | (3) | (C++20 起)

1) 通过重复调用 operator>> 生成元素序列的范围工厂。
2-3) 字符类型 char 与 wchar_t 的便利别名模板。
4) views::istream<T>(e) 对任何适合的子表达式 e 表达式等价于（拥有相同效果） ranges::basic_istream_view<T, typename U::char_type, typename U::traits_type>(e) ，其中 `U` 为 std::remove_reference_t<decltype(e)> 。若 `U` 不公开且无歧义地派生自 std::basic_istream<typename U::char_type, typename U::traits_type> 则程序非良构，这可能导致替换失败。
5) 仅用于阐释的概念 /*stream-extractable*/<Val,CharT,Traits> 在 `Val` 左值能从 std::basic_istream<CharT,Traits> 左值提取时得到满足。

`basic_istream_view` 的迭代器类型为仅移动：它不满足老式迭代器 (LegacyIterator) 要求，从而不能为 C++20 前的算法所用。

### 表达式等价

表达式 e 表达式等价于表达式 f ，若 e 与 f 拥有相同效果，均为潜在抛出或均非潜在抛出（即 noexcept(e) == noexcept(f) ），且均为常量子表达式或均非常量子表达式。

### 成员函数

(构造函数) (C++20) | 构造 `basic_istream_view` (公开成员函数)
begin (C++20) | 返回迭代器 (公开成员函数)
end (C++20) | 返回 std::default_sentinel (公开成员函数)
##### 继承自 std::ranges::view_interface
(无) | 尽管 `basic_istream_view` 派生自 std::ranges::view_interface ，它无法使用继承的成员函数。

## std::ranges::basic_istream_view::basic_istream_view

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

以 std::addressof(stream) 初始化存储的指针，并值初始化存储的 `Val` 值。

## std::ranges::basic_istream_view::begin

constexpr auto begin(); |  | (C++20 起)

等价于 *stream_ >> value_; return /*iterator*/{*this}; ，其中 `stream_` 为存储的指向流的指针，而 `value_` 是存储的 `Val` 的值。

## std::ranges::basic_istream_view::end

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

等价于 return std::default_sentinel; 。

### 嵌套类

iterator (C++20) | `basic_istream_view` 的迭代器类型，名字仅用于阐释 (仅用于阐释的成员类)

### 示例

    #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::ranges::istream_view<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::ranges::istream_view<float>(floats),
            std::ostream_iterator<float>{std::cout, ", "});
        std::cout << '\n';
    }

输出：

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

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
P2325R3 | C++20 | 因为 `view` 必须为 `default_initializable` 提供了默认构造函数 | 与该要求一同移除
LWG 3568 | C++20 | P2325R3 意外地使存储的值默认初始化 | 还原为值初始化
P2432R1 | C++20 | `ranges::istream_view` 曾为函数模板并且不遵循命名约定 | 使之为别名模板；添加了定制点对象

### 参阅

istream_iterator | 从 std::basic_istream 读取的输入迭代器 (类模板)