Конструктор перемещения C для класса со строковым членом

#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, и теперь ассемблер является ожидаемым. Примечание: было бы неплохо сделать ход, который ограничивает его параметр чем-то неконстантным.