873 / 460 / 90
Регистрация: 10.06.2014
Сообщений: 2,666
|
|
1 | |
Семантика перемещения и perfect forwarding11.01.2017, 13:49. Показов 1099. Ответов 13
Метки нет (Все метки)
Спасибо автору статьи https://www.cyberforum.ru/blog... og826.html
Но не понял кое что. А именно этот кусок. Прошу объяснить тех кто может Кому не трудно, объясните пожалуйста этот кусок, о чем там речь. Все остальное я понял
1
|
11.01.2017, 13:49 | |
Ответы с готовыми решениями:
13
Unique_ptr, семантика перемещения Семантика перемещения - разобрать код Семантика перемещения rvalue\lvalue ссылок move семантика |
873 / 460 / 90
Регистрация: 10.06.2014
Сообщений: 2,666
|
||||||
11.01.2017, 14:17 [ТС] | 3 | |||||
Разве? Помоему зависит от вызова.
Если функция вызвана с lvalue аргументом, тогда car -lvalue, если с rvalue, то rvalue.
0
|
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
|
||||||
11.01.2017, 14:26 | 4 | |||||
sys_beginner, переменная car в теле функции foo будет lvalue, вот пример:
1
|
873 / 460 / 90
Регистрация: 10.06.2014
Сообщений: 2,666
|
|
11.01.2017, 14:40 [ТС] | 5 |
JIawliet,
То есть весь текст о том, что ??? Добавлено через 1 минуту И что бы передать в другую функцию все таки rvalue, нужно использовать move? т.к он по сути кастует к rvalue
0
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
|
11.01.2017, 14:45 | 6 |
sys_beginner,
std::forward надо использовать исключительно с так зваными универсальными ссылками - это когда ф-ция шаблонная и есть вывод типа некого T и параметр ф-ции имеет точно вот такой вид: T&& . Если же у нас вывода типа нету, параметр ф-ции имеет тип Car&& - используем std::move
1
|
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
|
||||||
11.01.2017, 14:49 | 7 | |||||
Весь текст о том, что даже если вы попали в функцию / метод с rvalue
1
|
873 / 460 / 90
Регистрация: 10.06.2014
Сообщений: 2,666
|
||||||
11.01.2017, 15:14 [ТС] | 8 | |||||
notAll,
Кажется понял Если тип аргумента шаблонный и задан как &&, тогда если эта функция будет вызвана с временным и не временным объектом в качестве аргумента, то после вывода типов шаблонов функции будет две. Одна & другая &&. А на основе forward будет сгенерирован подходящий вызов иной функции (с & или &&) внутри шаблонной, все верно? Добавлено через 4 минуты Ага, понял, спасибо! Добавлено через 19 минут notAll, Подтвердите плз)) Говоря про forward, вы имели ввиду это, да?
0
|
873 / 460 / 90
Регистрация: 10.06.2014
Сообщений: 2,666
|
|
11.01.2017, 15:56 [ТС] | 10 |
notAll,
Спасибо. А как forward понимает что вызов был с rvalue или lvalue и генерирует соответственные вызовы для каждого типа шаблона? Ведь попавшая внутрь функции переменная всегда является lvalue, насколько я понял.
0
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
||||||
11.01.2017, 16:23 | 11 | |||||
std::forward<T> смотрит чем являеться тип T. Тип T выводиться по разному, в зависимости от переданного аргумента, вот пример: http://melpon.org/wandbox/perm... hq6QEaFnKc Ну а далее все дело за сворачиванием ссылок и правильным выводом/кастом. Напомню, что std::forwar реализован примерно так:
1
|
873 / 460 / 90
Регистрация: 10.06.2014
Сообщений: 2,666
|
|
11.01.2017, 16:36 [ТС] | 12 |
Немного странно. Ведь переменная-аргумент имеет тип T, так? Почему тогда если получается узнать что T это &&, но переменная при этом становится все равно lvalue? Потому что она перестает быть временной относительно функции? Но сам контекст вызова все равно сохраняется и forward это использует. Я правильно понял?
Добавлено через 35 секунд И ещё у вас тут явный каст к &&, как тогда получается что иногда форвард возвращает lvalue если результат всегда кастуется к rvalue?
0
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
||||||
11.01.2017, 16:42 | 13 | |||||
Сворачивания ссылок же:
1
|
873 / 460 / 90
Регистрация: 10.06.2014
Сообщений: 2,666
|
|
11.01.2017, 17:01 [ТС] | 14 |
notAll,
Спасибо. Можем подытожить обсуждение, а вы подтвержите пожалуйста, правильно ли я всё понял 1. static_cast & и && независимо от того слева двойной амперсанд или справа всегда дает в результате &, если же кастуемый объект является rvalue и кастуем к rvalue, получаем rvalue 2. Несмотря на то, что переменная внутри функции имеющая тип T&& при вызове становится lvalue, остается возможность вывести тип вызова (т.е определить вызов был через rvalue или lvalue) и этим пользуется forward когда делает каст 3. move нужно использовать только когда мы хотим всегда передать rvalue 4. forward только тогда, когда у нас используется так называемые универсальные ссылки, что бы обеспечить делегирование в подходящую перегруженную функцию с аргументом (& или &&). Я все правильно понял?
0
|
11.01.2017, 17:01 | |
11.01.2017, 17:01 | |
Помогаю со студенческими работами здесь
14
PERFECT HASH FUNCTION Шифрование методом Цезаря/простого перемещения/двойного перемещения/простой замены В списке сделать команды перемещения элемента вверх и вниз по списку (две кнопки для перемещения в ListBox) VPN forwarding Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |