一、介绍
在前面反复提到过,c++编程的语法也越来越向着自然语言方向发展,今天这个as_函数就是如此,一般学习过英文的都知道as是啥意思。非常容易理解,所以c++23中用这个词来描述函数,其实也是非常走心了。
二、as_const
有两个实现:std::ranges::views::as_const, std::ranges::as_const_view。
这个看名字就知道,变成常量呗,不让修改。这个里面还是有套路的,不知道最终是怎么实现。比如所谓不让修改,未必非得真正转成const,有的是办法达到目的。
其原型定义为:
template< ranges::view V >requires ranges::input_range<V>
class as_const_view: public ranges::view_interface<as_const_view<V>>
看一个cppreference.com上的例子:
#include <ranges>int main()
{int x[] {0, 1, 2};auto v1 = std::views::all(x);v1[0]++; // OK, can modify non-const object[[maybe_unused]]auto v2 = std::views::as_const(x);// v2[0]++; // Error, all elements of v2 are constant
}
[[maybe_unused]]的作用是让编译器不要对未使用的功能(包括函数或者变量)进行报警。
三、as_rvalue
这个有两个,std::ranges::views::as_rvalue, std::ranges::as_rvalue_view。其实就是在Ranges中进行std::move的动作。据说这个名字也是几易其稿,最终也还没有最终定下来。所以还得等最新标准落地才知道是个啥玩意儿。看一下原型定义:
template< ranges::view V >requires ranges::input_range<V>
class as_rvalue_view: public ranges::view_interface<as_rvalue_view<V>>
在上面两个as函数的下面,发现了一个模板定义:
template< class T >
inline constexpr bool enable_borrowed_range<std::ranges::as_rvalue_view<T>> =std::ranges::enable_borrowed_range<T>;
这是学Rust的节奏?
四、总结
这两个函数没有什么难点,但是如果用来起来还是非常方便的,可以通过管道直接进行STL中的容器的操作,慢慢的就也有相当一部分变成函数式编程了。不过这也不错,只要朝着简单的方向走,大方向肯定没有错。