Search code examples
c++c++11movemove-semantics

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


I want to provide zero-copy, move based API. I want to move a string from thread A into thread B. Ideologically it seems that move shall be able to simply pass\move data from instance A into new instance B with minimal to none copy operations (mainly for addresses). So all data like data pointers will be simply copied no new instance (constructed via move). So does std::move on std::string garantee that .c_str() returns same result on instance before move and instance created via move constructor?


Solution

  • No,

    but if that is needed, an option is to put the string in std::unique_ptr. Personally I would typically not rely on the c_str() value for more than the local scope.

    Example, on request:

    #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;
    }
    

    if you don't have make_unique (new in C++14).

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

    Or just copy the whole implementation from the proposal by S.T.L.:

    Ideone example on how to do that