作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C++20 介绍 views::all
这是一个范围适配器,返回 view
这包括其范围参数的所有元素。
表达式 views::all(E)
是表达式等效(具有相同的效果)到:
decay-copy(E)
如果E
的衰变类型型号 view
. ref_view{E}
如果该表达式格式正确 subrange{E}
view
的类型在使用
views::all
管道传输后不会改变(
goldbot ):
auto r = views::iota(0);
static_assert(std::same_as<decltype(r), decltype(r | views::all)>);
第二种情况用于包装一个
viewable_range
与
ref_view
为方便范围管道操作:
int r[] = {0, 1, 2};
static_assert(std::same_as<ranges::ref_view<int[3]>, decltype(r | views::all)>);
但是关于第三种情况,我想不出是在什么情况下
subrange{E}
格式良好且
ref_view{E}
是畸形的。
最佳答案
But regarding the third case, I can't think of under what circumstances
subrange{E}
is well-formed andref_view{E}
is ill-formed.
ref_view{E}
仅适用于左值范围。
subrange{E}
仅适用于借用范围。您可以在
[range.subrange.general] 中找到其扣除指南。 :
template<borrowed_range R>
subrange(R&&) ->
subrange<iterator_t<R>, sentinel_t<R>,
(sized_range<R> || sized_sentinel_for<sentinel_t<R>, iterator_t<R>>)
? subrange_kind::sized : subrange_kind::unsized>;
借用范围再次是左值或选择从中借用的范围。类型如
string_view
和
span
例如,是借来的。
vector<int>
,那么这不是 View (第一项),也不能构建
ref_view
从它(因为它是一个右值),你也不能构造一个
subrange
从它(因为它是一个非借用的范围)。
shared_ptr
中。 ,然后它的迭代器也共享该数据。就像是:
struct SharedVector {
std::shared_ptr<std::vector<int>> data;
struct Iterator {
std::shared_ptr<std::vector<int>> data;
std::vector<int>::iterator cur;
// ...
};
auto begin() -> Iterator { return {data, data->begin()}; }
auto end() -> Iterator { return {data, data->end()}; }
};
右值
SharedVector
不会是一个 View (不是
O(1)
-可破坏的),你不能
ref_view{E}
它(因为它是一个右值),但这样的范围仍然可以借用,所以
subrange{E}
可以工作。
关于c++ - 在什么情况下 ref_view{E} 格式错误而 subrange{E} 不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67466714/
C++20 介绍 views::all 这是一个范围适配器,返回 view这包括其范围参数的所有元素。 表达式 views::all(E)是表达式等效(具有相同的效果)到: decay-copy(E)
我是一名优秀的程序员,十分优秀!