【发布时间】:2018-10-20 09:21:08
【问题描述】:
正如我们所知,一个可移动的对象在分配给另一个相同类型的对象时不会被深度复制。通过这种方式,我们可以节省很多时间。 但是今天,我发现了一个对我来说很奇怪的现象。请查看以下代码。
#include <string>
#include <iostream>
int main() {
std::string s1 = "s1";
std::string s2 = "s2";
std::cout << " s1[" << ( void* ) &s1[0] << "]:" + s1
<< ", s2[" << ( void* ) &s2[0] << "]:" + s2
<< std::endl;
s1.swap( s2 );
std::cout << " s1[" << ( void* ) &s1[0] << "]:" + s1
<< ", s2[" << ( void* ) &s2[0] << "]:" + s2
<< std::endl;
s2 = std::move(s1);
std::cout << " s1[" << ( void* ) &s1[0] << "]:" + s1
<< ", s2[" << ( void* ) &s2[0] << "]:" + s2
<< std::endl;
return EXIT_SUCCESS; }
移动后,虽然字符串的内容发生了变化,但真正存储字符串数据的地址并没有改变。
如果内存地址不会改变,我们是否有理由确认实际上将执行深度复制,而不仅仅是分配一个指向目标成员的指针?
谢谢! 里昂
【问题讨论】:
-
你得到的输出是什么?预期的输出是什么?
-
是的,
std::string(C++11 起)可以移动,即它支持移动语义。
标签: c++ string pointers move-semantics