首页 > 解决方案 > 您可以从 c++2a 中的函数返回基于范围的视图吗?

问题描述

现在我找不到任何支持“单范围提案”的编译器,所以这更像是一个学术问题。我很好奇以下是否会像我预期的那样工作

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

auto Foo (){
    std::vector<int> a = {1,2,3,4,5};
    return std::move(a) | std::reverse;
}


int  main(){
   for(auto a : Foo()){
       std::cout << a << std::endl;
   }
}

预期输出为

5
4
3
2
1

这个问题与范围适配器的所有权语义有关。我说我想移动a然后用view包裹它。预计会发生什么?

  1. 不编译。
  2. 编译但可能会因内存损坏而崩溃
  3. 按预期工作

标签: c++c++20

解决方案


您可以从 c++2a 中的函数返回基于范围的视图吗?

你可以。

但是将视图返回到局部变量或临时变量是没有用的,因为通过视图访问被破坏对象的行为将是未定义的。与返回迭代器、指针或引用相同。

我说我想移动 a 然后用视图包裹它。预计会发生什么?

至少按照 range-v3 所做的,它静态断言操作数是一个左值,这会导致编译失败。


推荐阅读