Когда надо использовать универсальные ссылки?

Рейтинг: 0Ответов: 1Опубликовано: 05.06.2023

В каких случаях стоит использовать универсальные ссылки, кроме как с std::forward? Почему нельзя просто использовать const T&?

Ответы

▲ 1Принят

В голову приходит один пример. Допустим, вы пишете что-то типа std::for_each (функция зашаблонена типом лямбды, которую нужно вызвать больше одного раза; и/или зашаблонена типами аргументов).

std::forward легально вызывать только на последнем вызове лямбды, а добавлять проверку, последний это вызов или нет, не хочется (либо сложно, либо выглядит неэффективно). Поэтому можно лямбду принимать как typename T T &&func, а вызывать вообще без std::forward.

Почему не передавать const T &func? Потому что operator() может быть неконстантный.

Внимательный читатель возразит, что std::for_each принимает лямбду по значению - но они делают это зря (вот кому может понадобиться специально копировать лямбду с захватом??), в своих функциях я бы использовал forwarding ссылку.


Еще можно схитрить и вспомнить про std::forward_like, который иногда нужен вместо std::forward.