std::move on std::string 是否保证 .c_str() returns 相同的结果?

Does std::move on std::string garantee that .c_str() returns same result?

我想提供基于移动的零拷贝 API。我想将一个字符串从线程 A 移动到线程 B。从意识形态上讲,似乎 move 应该能够简单地将 pass\move 数据从实例 A 移动到新实例 B,而复制操作最少到 none (主要用于地址).所以像数据指针这样的所有数据都将被简单地复制而不是新的实例(通过移动构造)。 std::string 上的 std::move 是否保证 .c_str() returns 移动前的实例和通过移动构造函数创建的实例的结果相同?

没有。 std::string 不需要使用动态分配或对此类分配执行任何特定操作(如果有的话)。事实上,现代实现通常将短字符串放入字符串对象本身并且不分配任何东西;那么移动就和复制一样了

请务必记住,std::string 不是 容器,尽管它看起来与容器非常相似。与 std::string 相比,容器对其元素的保证更强。

不,不能保证。

保证它基本上会禁止(例如)短字符串优化,其中短字符串的整个主体存储在字符串对象本身中,而不是在堆上单独分配。

至少就目前而言,我认为 SSO 被认为足够重要,以至于委员会极不愿意禁止它(但这可能会改变——当最初的 C++98 标准被编写时,他们进行了相当多的允许写时复制字符串的麻烦,但它们现在被禁止了)。

没有,

但如果需要,一个选项是将字符串放入 std::unique_ptr。就个人而言,我通常不会依赖 c_str() 值超过本地范围。

示例,应要求提供:

#include <iostream>
#include <string>
#include <memory>

int main() {
    std::string ss("hello");
    auto u_str = std::make_unique<std::string>(ss);
    std::cout << u_str->c_str() <<std::endl;
    std::cout << *u_str <<std::endl;
    return 0;
}

如果你没有 make_unique(C++14 中的新功能)。

auto u_str = std::unique_ptr<std::string>(new std::string(ss));

或者只是从 proposal by S.T.L.:

复制整个实现

Ideone example on how to do that