Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
-22 / 5 / 0
Регистрация: 15.08.2014
Сообщений: 516

Как работает перемещение и rvalue в моем примере ?

06.07.2024, 22:17. Показов 2012. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Помогите, пожалуйста, понять rvalue и семантику перемещения на следующем примере:

насколько я понимаю такого рода пример должен приводить к перемещению значения строки s,
т.е. она должна остаться пустой, однако этого не происходит.
Почему ?
В этом примере это вообще невозможно, он некорректен ?
Или возможно, но я что-то не так сделал ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string>
 
void rv(std::string&& s_rv){
   ... делаем что-то со строкой s_rv
 
   std::string s2 = s_rv;
 
}
 
main() {
   std::string s = "123";
 
   rv(std::move(s));
 
   std::cout << s << std::endl;
 
   // здесь вывод = "123". Почему ? Это конструкция не переместит значение
   // значение строки из  s?
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.07.2024, 22:17
Ответы с готовыми решениями:

Объясните как работает полиморфизм на моем примере
Здравствуйте уважаемые. Пожалуйста объясните на моем примере, как это работает. Выдержки из моего кода. class Instrumenti { ...

Объяснить как работает рекурсивная функция и стек вызовов на моем примере
Объясните пожалуйста как работает рекурсивная функция и стек вызовов на моем примере. Здесь известный алгоритм &quot;Разделяй и...

Обращение к модулю по имени. В скачанном примере работает, в моём нет
Нашёл модуль глобального обработчика ошибок. Честно всё скопировал, но у меня стал ругаться. Сам класс называется &quot;CError&quot;. ...

22
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13229 / 6861 / 1827
Регистрация: 18.10.2014
Сообщений: 17,393
08.07.2024, 22:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SmallEvil Посмотреть сообщение
Последняя barfoo, с двумя перегрузками, покрывает все случаи, конечно, если это необходимо. При этом ничего не копируется и не перемещается. При этом ничего не копируется и не перемещается.
Если функции barfoo нет необходимости модифицировать свой параметр, то тогда достаточно одного варианта - barfoo(const A &).

А вот если функции barfoo нужно модифицировать свой параметр, то вариант barfoo(const A &) будет скорее всего вынужден сделать копию своего параметра внутри функции. То есть копирование при этом все-таки будет, просто оно будет упрятано внутрь функции, а не привязано к параметру.

В такой ситуации может оказаться разумнее написать просто одну-единственную barfoo(A) вместо двух вариантов, т.е. с передачей по значению. Эффективность варианта barfoo(const A &) при этом не упадет, ибо копирование этот вариант и так делал. Оно теперь просто переместилось на параметр.

Эффективность варианта barfoo(A &&) немножко упадет, ибо в исходном варианте перемещение было не нужно, а здесь понадобится одно перемещение. Но в большинстве случаев цента такого перемещения - невелика, а взамен мы получаем одну функцию вместо двух. В случае, когда параметров много, это также позволяет избежать комбинаторного взрыва вариантов.

Поэтому общее правило таково: если вам нужно выжать последние такты производительности на основе move semantics, то пишите две функции: const A & и A &&. А если такого "выжимания" не требуется (что составляет 99%) - пишите одну с передачей по значению A. Вы получите практически всё от move semantics, но без необходимости писать две функции.
1
фрилансер
 Аватар для Алексей1153
6506 / 5751 / 1134
Регистрация: 11.10.2019
Сообщений: 15,399
09.07.2024, 08:06
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
то пишите две функции: const A & и A &&.
как вариант - шаблон с форвардом
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13229 / 6861 / 1827
Регистрация: 18.10.2014
Сообщений: 17,393
09.07.2024, 08:12
Цитата Сообщение от Алексей1153 Посмотреть сообщение
как вариант - шаблон с форвардом
Это если функция просто форвардит аргументы дальше. Я же вел речь о ситуации, когда рассматриваемая функция уже является конечным получателем аргументов, т.е. реализует оконечную функциональность, работает с аргументами сама.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2024, 08:12

Как использовать пример наследование моем примере?
Я сделал в windows forms Чтение и запись данных в файл Вот код: namespace test_3 { public partial class Form1 : Form { public...

Обьясните как дублировать...на моём примере пожалуйста!!!
Вводится длина одномерного массива, состоящего из целых чисел, и его элементы. продублировать элементы, являющиеся числами Фибоначчи; ...

Как работать с двумерными массивами через указатель на моем примере?
Имеются одномерные массивы {x}_{k} и {x}_{i}, с которыми я работаю через указатель. Например: void x (double *xk, double *xi, double...

Не работает javasript анимация на моем сайте. На отдельной html странице работает, на моем не хочет
&lt;html&gt; &lt;head&gt;&lt;title&gt;Линейное движение картинки&lt;/title&gt; &lt;script&gt; function init_move() { dx = 8 // приращение по осям ...

Как сделать так, чтобы айдишники самостоятельно проставлялись? покажите пожалуйста на моем примере
здесь коды проставлены вручную --создание таблицы поставщик create table posta( Kod_posta integer primary key, FIO_posta...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru