170 похожих чатов

KV::KV(Std::String&& key, std::string&& value) : m_key(key), m_value(value) {} Можно ли так

делать? Будет ли тут перемещение?

21 ответов

27 просмотров

Не будет. Надо читать про мув-семантику

Можно Не будет

Eyed-Shovel Автор вопроса
Liber Azerate
Не будет. Надо читать про мув-семантику

Я помню, что string и r-value не дружат. А как сделать, чтобы было?

Eyed Shovel
Я помню, что string и r-value не дружат. А как сде...

Дело не в строке. Дело в непонимании мув-семантики

Можно. Нужен std::move, в твоем коде две копии

Eyed-Shovel Автор вопроса
Artöm Bakri Al-Sarmini
Можно. Нужен std::move, в твоем коде две копии

Почему? m_key = key. Справа r-value reference. Почему не вызовется оператор присваивания перемещением?

Eyed Shovel
Почему? m_key = key. Справа r-value reference. Поч...

Потому что тип переменной key T&&, но тип выражения key это T&. В твоем контексте это выражения

Eyed-Shovel Автор вопроса
Artöm Bakri Al-Sarmini
Потому что тип переменной key T&&, но тип выражени...

KV::KV(KV&& kv) : m_key(std::move(kv.m_key)), m_value(std::move(kv.m_value)) { kv.m_key = nullptr; kv.m_value = nullptr; } А это сработает?

Eyed Shovel
KV::KV(KV&& kv) : m_key(std::move(kv.m_key)), m_va...

Да, это хорошо. Но строки нулить лучше через erase

Eyed-Shovel Автор вопроса
Eyed Shovel
Почему?

Во-первых, nullptr тут писать нельзя (смотри (7) https://en.cppreference.com/w/cpp/string/basic_string/operator%3D), можно "". Во-вторых, erase операция более подходящая по контексту, чем присваивание пустой строки

Eyed Shovel
Всё равно этого не понял. Аргумент же T&&...

А выражение T&. Если не хочешь читать, я могу найти видео с выступлением Мейерса об этой теме

Eyed Shovel
Всё равно этого не понял. Аргумент же T&&...

Открываем cppreference The following expressions are lvalue expressions: the name of a variable, a function, a template parameter object (since C++20), or a data member, regardless of type, such as std::cin or std::endl. Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression;

Yurij horssyyy
Открываем cppreference The following expressions a...

Он не понимает разницу между переменной и выражением

Eyed-Shovel Автор вопроса
Artöm Bakri Al-Sarmini
Он не понимает разницу между переменной и выражени...

Я не понимаю, что подразумевается под словом "выражение"

Eyed Shovel
Я не понимаю, что подразумевается под словом "выра...

На том же сайте есть про выражения и что это такое

Ну и отвечая на твой вопрос - нет. Move это static_cast (с remove_reference) к T&&, а как ты видишь тут никакого каста нет.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта