2012-10-31 104 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'類當然是一個字符串,但是它並不需要連續存儲。事實上,這是一個重點:在任意位置具有快速插入性能。 –