C++:字符串中的移动语义 #追加

7

我需要将一些字符串合并成一个,为了效率的考虑,我想在这种情况下使用移动语义(当然这些字符串将不再被使用)。所以我尝试了以下代码:

#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!

如果将append替换为operator+=,它将产生相同的结果。那么应该如何正确地实现?

我在Debian 6.10上使用g++ 4.7.1。

1个回答

12

您不能将一个string移入另一个string的一部分。这将要求新的string具有两个存储缓冲区:当前缓冲区和新缓冲区。然后,它就必须神奇地使这一切连续,因为C++11要求std::string连续的内存中。

简而言之,您无法这样做。


"C++11要求std::string在连续的内存中。任何类型的C/C++都需要字符串在内存中是连续的,因为字符串是以0结尾的BYTEs/WORDs数组。因此,在任何情况下,它都不能是非连续的,否则您将无法使用“sz = str.c_str(); while(*sz){ ++sz; }”进行迭代。" - CodeAngry
@Claudrian:概念上的字符串是字符序列;不需要连续性。字符串字面值是以\0字符结尾的连续字符数组。std::string也是一个连续的字符数组。SGI STL的rope类肯定是一个字符串,但没有要求它在连续的内存中。事实上,这就是重点:在任意位置具有快速插入性能。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接