Что такое rvalue ссылка на тип функции? - PullRequest
15 голосов
/ 10 августа 2011

Я недавно сосредоточился на концепциях glvalues, xvalues ​​и prvalues, а также на ссылках на rvalue.Тем не менее, есть одна вещь, которая все еще ускользает от меня:

Что такое "ссылка на значение типа" ?Это буквально много раз упоминается в черновиках.Почему была введена такая концепция?Каковы его значения?

Ответы [ 2 ]

15 голосов
/ 11 августа 2011

Я не хочу быть круглым, но ссылка на тип функции - это ссылка на тип функции.Существует такая вещь, как тип функции, например void ().И вы можете сформировать rvalue ссылку на него.

С точки зрения системы классификации, представленной N3055 , это xvalue.

Его использование редкое и неясное,но это не бесполезно.Рассмотрим для примера:

void f() {}
...
auto x = std::ref(f);

x имеет тип:

std::reference_wrapper<void ()>

И если вы посмотрите на синопсис для reference_wrapper, он включает:

reference_wrapper(T&) noexcept;
reference_wrapper(T&&) = delete; // do not bind to temporary objects

В этом примере T - это тип функции void ().И поэтому второе объявление формирует ссылку rvalue на тип функции с целью обеспечения невозможности создания reference_wrapper с аргументом rvalue.Даже если T является константой.

Если было бы недопустимо формировать ссылку на значение rvalue для функции, тогда эта защита привела бы к ошибке времени компиляции, даже если мы не передали значение rvalue Tконструктор.

0 голосов
/ 11 августа 2011

В старом стандарте c ++ запрещено следующее:

int foo();
void bar(int& value);

int main()
{
    bar(foo());
}

, поскольку возвращаемый тип foo () является значением r и передается по ссылке на bar ().

Thisбыло разрешено, хотя с включенными расширениями Microsoft в Visual C ++ с (я думаю) 2005 года.

Возможные обходные пути без C ++ 0x (или MSVC) будет объявить

void bar(const int& value); 

или использовать временную-variable, сохраняя возвращаемое значение foo () и передавая переменную (как ссылку) в bar ():

int main()
{
    int temp = foo();
    bar(temp);
}
...