2012-10-31 65 views
4

我需要将一些字符串合并到一个字符串中,出于有效的原因,我希望在这种情况下使用移动语义(当然这些字符串不会再被使用)。所以,我想C++:在字符串中追加语义#追加

#include <iostream> 
#include <algorithm> 
#include <string> 

int main() 
{ 
    std::string hello("Hello, "); 
    std::string world("World!"); 
    hello.append(std::move(world)); 
    std::cout << hello << std::endl; 
    std::cout << world << std::endl; 
    return 0; 
} 

我认为它会输出

Hello, World! 
## NOTHING ## 

但实际输出

Hello, World! 
World! 

它会导致同样的事情,如果operator+=更换append。什么是正确的方法来做到这一点?

我用G ++ 4.7.1在Debian 6.10

回答

7

不能移动string的另一string部分。这将需要新的string有效地有两个存储缓冲区:当前的和新的。然后它将不得不神奇地使这一切连续,因为C++ 11需要std::string连续内存。

总之,你不能。

+0

“C++ 11要求std :: string在连续内存中......”**任何类型的C/C++都要求字符串在内存中是连续的**,一个字符串是BYTEs /话。所以在任何情况下它都不可能是不连续的,因为你不能用'sz = str.c_str()来迭代它。 while(* sz){++ sz; }'。 – CodeAngry

+0

@Claudrian:A *概念*字符串是一系列字符;不需要连续性。一个字符串* literal *是一个以'\ 0'字符结尾的连续字符数组。一个'std :: string'也是一个连续的字符数组。 SGI STL'rope'类当然是一个字符串,但是它并不需要连续存储。事实上,这是一个重点:在任意位置具有快速插入性能。 –