Я не хочу быть круглым, но ссылка на тип функции - это ссылка на тип функции.Существует такая вещь, как тип функции, например 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
конструктор.