rvalue-ссылка на массив: это действительно может произойти? - PullRequest
5 голосов
/ 04 февраля 2012

Рассмотрим этот код:

#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-ссылка на массивы не запрещена, а просто не может быть использована?

EDIT:

Я только что понял, что это работает:

array&& ret3(){
    return std::move(sample);
}

теперь самое интересное - понять, чего это на самом деле стоит ...

1 Ответ

4 голосов
/ 04 февраля 2012

Ну, теперь вы рассматриваете свой массив как r-значение.Вы можете думать об этом как о временном объекте.Вы можете использовать эту информацию и помнить, что ее содержание безопасно изменять.Например, вы можете написать функцию print_sorted(array&), которая будет печатать отсортированное содержимое данного массива.Для этого вы можете отсортировать его в некотором дополнительном буфере, поскольку вы не хотите перемешивать данные.Но та же функция с print_sorted(array&&) прототипом может сортировать массив на месте, поскольку она знает, что объект является временным.

Однако ссылки на значения r на простые объекты без динамических данных не кажутся очень полезными.

...