захват универсальной ссылки в лямбду
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.02.20 12:04
Оценка:
привет!

есть такое:
template<typename F>
void bind(F &&f) {
    auto cb = [f](...){ ... }; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    // тут я положу 'cb' в некоторый контейнер
}


вопрос в том, что я не понимаю как я должен тут поступить...

с одной стороны — для lvalue тут будет copy-ctor, но для rvalue — не понимаю... ('f', который останется в лямбде, будет инициализирован rvalue ссылкой?)
с другой — если изменить список захвата так '[f=std::move(f)]' — то, кажется, смысл появляется. но, тогда мне кажется более разумным использовать 'std::forward<>()' ?... оф %)

проясните, плиз.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 09.02.2020 12:08 niXman . Предыдущая версия . Еще …
Отредактировано 09.02.2020 12:07 niXman . Предыдущая версия .
Отредактировано 09.02.2020 12:04 niXman . Предыдущая версия .
Re: захват универсальной ссылки в лямбду
От: rg45 СССР  
Дата: 09.02.20 12:42
Оценка: 18 (2) +4 :)
Здравствуйте, niXman, Вы писали:

X>привет!


X>есть такое:

X>
X>template<typename F>
X>void bind(F &&f) {
X>    auto cb = [f](...){ ... }; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

X>    // тут я положу 'cb' в некоторый контейнер
X>}
X>


X>вопрос в том, что я не понимаю как я должен тут поступить...


X>с одной стороны — для lvalue тут будет copy-ctor, но для rvalue — не понимаю... ('f', который останется в лямбде, будет инициализирован rvalue ссылкой?)

X>с другой — если изменить список захвата так '[f=std::move(f)]' — то, кажется, смысл появляется. но, тогда мне кажется более разумным использовать 'std::forward<>()' ?... оф %)

X>проясните, плиз.


f внутри функции bind в любом случае является lvalue выражением, каким бы ни был тип F. Как только rvalue ссылка приобретает имя, она превращается в lvalue. В данном случае, если ты хочешь подключить использование move-семантики, нужно использовать forward:

    auto cb = [f = std::forward<F>(f)](...){ ... }; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
--
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.