在vs2012中移动一个字符串

Qin*_*Yun 2 c++ string move c++11

std::string t1("aaa");
const char *p = t1.c_str();
std::string t2(std::move(t1));
if (p == t2.c_str()) {
    std::cout << "ok!" << std::endl;    
}
Run Code Online (Sandbox Code Playgroud)

此代码在vs2012中没有打印.它只是使用memmove内部字符串复制t1t2.为什么?

Jam*_*nze 9

正如jrok指出的那样,你正在做的事情是未定义的行为,所以无论实现的是什么,你都无权抱怨.实际上,它将取决于实施.该标准不要求移动构造函数对std::string源字符串做任何事情.如果实现使用小字符串优化(例如VC++),并且字符串足够小以符合条件,那么除了 memcpy字符之外它没有办法做任何事情 ; 它们位于char[]字符串对象本身中.一个CoW实现(就像在g ++中那样)可能没有做任何与它在复制构造函数中所做的不同的事情,理由是它不值得打扰; 你不会真的省钱.(但它可能,因为只是交换指针会节省一点.)

我只是在VC++中尝试了同样的事情,但是使用了100个字符的字符串.它做了交换(两个指针相等).因此VC++的行为取决于字符串是否足够小以供SSO应用.G ++在所有情况下交换.