c++23中的新功能之十三Ranges的as系列

一、介绍

在前面反复提到过,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
class as_const_view
    : public ranges::view_interface>

看一个cppreference.com上的例子:

#include 

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中的容器的操作,慢慢的就也有相当一部分变成函数式编程了。不过这也不错,只要朝着简单的方向走,大方向肯定没有错。

你可能感兴趣的:(C++11,C++,c++23)