rvalue-ссылка на массив: может ли это действительно случиться?

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

#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);
}

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

5
задан ildjarn 3 February 2012 в 23:05
поделиться