Неужели я неправильно понял семантику std::move
?
Отчасти да.Вы забыли преобразовать параметр функции str
в значение.В пределах some_method
оно снова стало lvalue.Чтобы это исправить:
void some_method(std::string&& str) {
my_str = std::move(str);
// ^^^^^^^^^ Necessary: invoke std::move a 2nd time
}
Но обратите внимание на следующее.std::string
объект "Move-from" - это то, что вам не нужно assert
.С здесь , перегрузка # 8 (выделено мной):
Переместить конструктор.Создает строку с содержимым другого, используя семантику перемещения.other остается в допустимом, но неопределенное состояние .
Вы не хотите, чтобы ваша программа зависела от неопределенного состояния (даже если случается, что конкретная реализация делает std::string::size
вернуть 0 после потребления его ресурсов).