std::ranges::viewable_range
来自cppreference.com
<tbody>
</tbody>
| 在标头 <ranges> 定义
|
||
template< class T > concept viewable_range = ranges::range<T> && ((ranges::view<std::remove_cvref_t<T>> && std::constructible_from<std::remove_cvref_t<T>, T>) || (!ranges::view<std::remove_cvref_t<T>> && (std::is_lvalue_reference_v<T> || (std::movable<std::remove_reference_t<T>> && !/*is-initializer-list*/<T>)))); |
(C++20 起) | |
viewable_range 概念是 range 的精化,它描述能通过 views::all 转换成 view 的范围。
当且仅当 std::remove_cvref_t<T> 为 std::initializer_list 的特化时,常量 /*is-initializer-list*/<T> 为 true。
示例
运行此代码
#include <ranges>
#include <string>
#include <vector>
struct valid_result {};
struct invalid_result {};
template <typename T>
concept valid_viewable_range = std::same_as<T, valid_result>;
template <typename T>
concept invalid_viewable_range = std::same_as<T, invalid_result>;
auto test_viewable_range(std::ranges::viewable_range auto &&) -> valid_result;
auto test_viewable_range(auto&&) -> invalid_result;
int main()
{
auto il = {1, 2, 3};
int arr []{1, 2, 3};
std::vector vec{1, 2, 3};
std::ranges::ref_view r{arr};
std::ranges::owning_view o{std::string("Hello")};
static_assert(requires {
{ test_viewable_range(il) } -> valid_viewable_range;
{ test_viewable_range(std::move(il)) } -> invalid_viewable_range;
{ test_viewable_range(arr) } -> valid_viewable_range;
{ test_viewable_range(std::move(arr)) } -> invalid_viewable_range;
{ test_viewable_range(vec) } -> valid_viewable_range;
{ test_viewable_range(std::move(vec)) } -> valid_viewable_range;
{ test_viewable_range(r) } -> valid_viewable_range;
{ test_viewable_range(std::move(r)) } -> valid_viewable_range;
{ test_viewable_range(o) } -> invalid_viewable_range;
{ test_viewable_range(std::move(o)) } -> valid_viewable_range;
{ test_viewable_range(std::ranges::ref_view(o)) } -> valid_viewable_range;
});
}
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3481 | C++20 | viewable_range 曾接受仅移动视图的左值
|
拒绝 |
| P2415R2 | C++20 | viewable_range 仅接受作为 borrowed_range 的非 view 右值
|
接受更多类型 |
参阅
(C++20) |
包含 range 的所有元素的 view (别名模板) (范围适配器对象) |