c++ - 您可以从 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包裹它。预计会发生什么?
- 不编译。
- 编译但可能会因内存损坏而崩溃
- 按预期工作
解决方案
您可以从 c++2a 中的函数返回基于范围的视图吗?
你可以。
但是将视图返回到局部变量或临时变量是没有用的,因为通过视图访问被破坏对象的行为将是未定义的。与返回迭代器、指针或引用相同。
我说我想移动 a 然后用视图包裹它。预计会发生什么?
至少按照 range-v3 所做的,它静态断言操作数是一个左值,这会导致编译失败。