делать? Будет ли тут перемещение?
Не будет. Надо читать про мув-семантику
Можно Не будет
Я помню, что string и r-value не дружат. А как сделать, чтобы было?
Дело не в строке. Дело в непонимании мув-семантики
Можно. Нужен std::move, в твоем коде две копии
Почему? m_key = key. Справа r-value reference. Почему не вызовется оператор присваивания перемещением?
Потому что тип переменной key T&&, но тип выражения 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; } А это сработает?
Да, это хорошо. Но строки нулить лучше через erase
Всё равно этого не понял. Аргумент же T&&...
Во-первых, nullptr тут писать нельзя (смотри (7) https://en.cppreference.com/w/cpp/string/basic_string/operator%3D), можно "". Во-вторых, erase операция более подходящая по контексту, чем присваивание пустой строки
А выражение 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;
Он не понимает разницу между переменной и выражением
Я не понимаю, что подразумевается под словом "выражение"
На том же сайте есть про выражения и что это такое
Ну и отвечая на твой вопрос - нет. Move это static_cast (с remove_reference) к T&&, а как ты видишь тут никакого каста нет.
Обсуждают сегодня