Ответ 1
Я ненавижу быть круговым, но ссылка rvalue на тип функции - это ссылка rvalue на тип функции. Существует такая функция, как тип функции, например. void ()
. И вы можете сформировать ссылку rvalue.
В терминах системы классификации, введенной N3055, это значение x.
Его использование редки и неясны, но это не бесполезно. Рассмотрим, например:
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
.