具有字符串成员的 class 的 C++ 移动构造函数
C++ move constructor for a class with string member
我写了一个 class,代码如下:
class Test {
public:
...
Test( const Test &&that ) : i(that.i), s(std::move(that.s)) {
cout << "move contructor." << endl;
}
...
private:
int i;
std::string s;
};
如果我反汇编生成的代码,我会看到:
.type Test::Test(Test const&&), @function
Test::Test(Test const&&):
...
call std::remove_reference<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>::type&& std::move<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
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> > const&)@PLT
对 basic_string<...>::basic_string( basic_string<...> const&)
的调用让我感到惊讶,因为我期望调用 basic_string basic_string<...>::basic_string( basic_string<...> &&)
.
的移动构造函数
我以错误的方式实现了移动构造函数?
对 const 类型的右值引用不是很有用。他们说代码可以从对象中窃取,但必须在不改变其值的情况下这样做?
由于 std::string
没有 string(const string&&)
移动构造函数,重载解析只能使用 string(const string&)
复制构造函数。
普通移动构造函数不使用 const
:
Test( Test &&that ) : i(that.i), s(std::move(that.s)) {
std::cout << "move constructor." << std::endl;
}
我写了一个 class,代码如下:
class Test {
public:
...
Test( const Test &&that ) : i(that.i), s(std::move(that.s)) {
cout << "move contructor." << endl;
}
...
private:
int i;
std::string s;
};
如果我反汇编生成的代码,我会看到:
.type Test::Test(Test const&&), @function
Test::Test(Test const&&):
...
call std::remove_reference<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>::type&& std::move<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
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> > const&)@PLT
对 basic_string<...>::basic_string( basic_string<...> const&)
的调用让我感到惊讶,因为我期望调用 basic_string basic_string<...>::basic_string( basic_string<...> &&)
.
我以错误的方式实现了移动构造函数?
对 const 类型的右值引用不是很有用。他们说代码可以从对象中窃取,但必须在不改变其值的情况下这样做?
由于 std::string
没有 string(const string&&)
移动构造函数,重载解析只能使用 string(const string&)
复制构造函数。
普通移动构造函数不使用 const
:
Test( Test &&that ) : i(that.i), s(std::move(that.s)) {
std::cout << "move constructor." << std::endl;
}