Рассмотрим этот код:
#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);
}
теперь самое интересное понимает, чего это на самом деле стоит ...