Когда надо использовать универсальные ссылки?
В каких случаях стоит использовать универсальные ссылки, кроме как с std::forward? Почему нельзя просто использовать const T&?
В каких случаях стоит использовать универсальные ссылки, кроме как с std::forward? Почему нельзя просто использовать const T&?
В голову приходит один пример. Допустим, вы пишете что-то типа std::for_each
(функция зашаблонена типом лямбды, которую нужно вызвать больше одного раза; и/или зашаблонена типами аргументов).
std::forward
легально вызывать только на последнем вызове лямбды, а добавлять проверку, последний это вызов или нет, не хочется (либо сложно, либо выглядит неэффективно). Поэтому можно лямбду принимать как typename T
T &&func
, а вызывать вообще без std::forward
.
Почему не передавать const T &func
? Потому что operator()
может быть неконстантный.
Внимательный читатель возразит, что std::for_each
принимает лямбду по значению - но они делают это зря (вот кому может понадобиться специально копировать лямбду с захватом??), в своих функциях я бы использовал forwarding ссылку.
Еще можно схитрить и вспомнить про std::forward_like
, который иногда нужен вместо std::forward
.