c++ - 对数组 : can it actually happen? 的右值引用

标签 c++ arrays c++11 rvalue-reference move-semantics

考虑这段代码:

#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/

相关文章:

c++ - 范围和头文件的困难

c++ - 在 Eclipse 中使用 PCL

php - 搜索日期数组不返回结果

javascript - 当先前的数组被删除时,数组是未定义的

java - 将 parseInt 更改为 nextInt

c++ - 这两个函数签名有什么区别?

linux - 使用 boost 和 C++11 构建进程崩溃

c++ - 在 Linux 上编译简单信号代码时从 void* 到 void (*) int 的无效转换

c++ - 在 C++ 中修复 static_cast<int>() 的精度

c++ - 是否可以将带有捕获和参数的 lambda 传递给另一个函数?如果是这样,如何?