考虑这段代码:
#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()
。事实上,如果我省略实现而只声明它,它会编译(当然永远不会链接),但我真的不知道如何显式返回对数组的右值引用。如果这不可能发生,那么我是否可以得出结论,对数组的右值引用并未被禁止,只是不能使用?
编辑:
我刚刚意识到这行得通:
array&& ret3(){
return std::move(sample);
}
现在的乐趣在于了解它的实际值(value)......
最佳答案
好吧,您现在将数组视为右值。您可以将其视为一个临时对象。您可以使用此信息并记住修改其内容是安全的。例如,您可以编写 print_sorted(array&)
函数来打印给定数组的排序内容。为此,您可以在一些额外的缓冲区中对其进行排序,因为您不想打乱给定的数据。但是具有 print_sorted(array&&)
原型(prototype)的相同函数可以就地对数组进行排序,因为它知道该对象是临时的。
但是,对没有存储动态数据的普通对象的右值引用似乎不是很有用。
关于c++ - 对数组 : can it actually happen? 的右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9136520/