# std::ranges::views::all, std::ranges::views::all_t

< cpp‎ | ranges

定义于头文件 `<ranges>` |  |
inline constexpr /*unspecified*/ all = /*unspecified*/; | (1) | (C++20 起)
template <ranges::viewable_range R> using all_t = decltype(views::all(std::declval<R>())); | (2) | (C++20 起)

1) 返回包含其 `range` 参数的所有元素的 `view` 的范围适配器对象（亦为范围适配器闭包对象）。

表达式 views::all(e) 表达式等价于：

- 隐式转换 e 为 std::decay_t<decltype((e))> 纯右值，若结果类型实现 `view` 。
- 否则为 std::ranges::ref_view{e} ，若该表达式为良构。
- 否则为 std::ranges::owning_view{e} 。

2) 计算 `viewable_range` 类型的适合 `view` 类型。

### 表达式等价

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

### 示例

    #include <ranges>
    #include <vector>
    #include <iostream>
    #include <type_traits>

    int main()
    {
        std::vector<int> v{0,1,2,3,4,5};
        for(int n : std::views::all(v) | std::views::take(2) ) {
            std::cout << n << ' ';
        }

        static_assert(std::is_same<
            decltype(std::views::single(42)),
            std::ranges::single_view<int>
            >{});

        static_assert(std::is_same<
            decltype(std::views::all(v)),
            std::ranges::ref_view<std::vector<int, std::allocator<int>>>
            >{});

        int a[]{1,2,3,4};
        static_assert(std::is_same<
            decltype(std::views::all(a)),
            std::ranges::ref_view<int [4]>
            >{});

        static_assert(std::is_same<
            decltype(std::ranges::subrange{std::begin(a)+1, std::end(a)-1}),
            std::ranges::subrange<int*, int*, std::ranges::subrange_kind(1)>
            >{});
    }

输出：

    0 1

### 缺陷报告

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

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
P2415R2 | C++20 | `views::all` 对非 `view` 右值 `range` 返回 `subrange` | 对其返回 `owning_view`

### 参阅

ranges::empty_view views::empty (C++20) | 无元素的空 `view` (类模板) (变量模板)
ranges::single_view views::single (C++20) | 含有具有指定值的单个元素的 `view` (类模板) (定制点对象)