rvalue引用到数组:真的可能发生吗?

5

考虑以下代码:

#include <iostream>
using namespace std;

typedef int array[12];

array sample;

array ret1(){   //won't compile
    return sample;
}

array& ret2(){
    return sample;
}

array&& ret3(){
    return sample;  //won't compile
}

void eat(array&& v){
    cout<<"got it!"<<endl;
}

int main(){
    eat(ret1());
    eat(ret2());    //won't compile
    eat(ret3());    //compiles, but I don't really know how to write a function that returns a rvalue-reference to an array
}

唯一可以编译的版本是ret3()。实际上,如果我省略实现并仅声明它,它会编译(当然永远不会链接),但我真的不知道如何明确地返回对数组的rvalue引用。如果这不可能发生,那么我可以得出结论,数组的rvalue引用并没有被禁止,只是不能使用吗?
编辑:
我刚意识到这个可以运行:
array&& ret3(){
    return std::move(sample);
}

现在有趣的事情是理解它实际价值...


可能是Array and Rvalue的重复问题。 - Ken Wayne VanderLinde
实际上,我在问题中有点忽略了“引用”这一点。这根本不是重复的。 - Ken Wayne VanderLinde
一个rvalue指针和一个lvalue指针 - 无论哪种方式,它都会衰减,那么这里的感知好处是什么? - ildjarn
@Ken,那个问题的被接受答案是错误的。真遗憾。 - Johannes Schaub - litb
1个回答

4

你现在将数组视为r-value。你可以将其视为临时对象。你可以利用这些信息并记住修改其内容是安全的。例如,你可以编写print_sorted(array&)函数,它将打印给定数组的排序内容。为此,你可以在一些额外的缓冲区中对其进行排序,因为你不想打乱给定的数据。但是带有print_sorted(array&&)原型的相同函数可以就地对数组进行排序,因为它知道该对象是临时的。

然而,对于没有存储动态数据的普通对象的r-value引用似乎没有什么用处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接