#c #move-semantics
Вопрос:
Я написал класс со следующим кодом:
class Test {
public:
...
Test( const Test amp;amp;that ) : i(that.i), s(std::move(that.s)) {
cout << "move contructor." << endl;
}
...
private:
int i;
std::string s;
};
если я разберу сгенерированный код, я увижу:
.type Test::Test(Test constamp;amp;), @function
Test::Test(Test constamp;amp;):
...
call std::remove_reference<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > constamp;>::typeamp;amp; std::move<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > constamp;>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > constamp;)
movq %rax, %rsi
movq %rbx, %rdi
.LEHB3:
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > constamp;)@PLT
это удивляет меня вызовом basic_string<...>::basic_string( basic_string<...> constamp;)
, потому что я ожидал вызова конструктора перемещения basic_string basic_string<...>::basic_string( basic_string<...> amp;amp;)
.
Я неправильно реализую конструктор перемещения ?
Комментарии:
1. Какой компилятор вы используете? Это отладочный или выпускной вариант кода?
2. @HajoKirchhoff: g 9.3.0
Ответ №1:
Ссылки Rvalue на типы const не очень полезны. Они говорят, что код может украсть у объекта, но должен делать это без изменения его значения?
Поскольку std::string
у него нет string(const stringamp;amp;)
конструктора перемещения, разрешение перегрузки может использовать только string(const stringamp;)
конструктор копирования.
Обычный конструктор перемещений не использует const
:
Test( Test amp;amp;that ) : i(that.i), s(std::move(that.s)) {
std::cout << "move constructor." << std::endl;
}
Комментарии:
1. Моя ошибка, спасибо. Удален const, и теперь ассемблер является ожидаемым. Примечание: было бы неплохо сделать ход, который ограничивает его параметр чем-то неконстантным.