提问者:小点点

std::move(std::string)不使传递的参数变为空状态


我有点不明白为什么std::move(std::string)不使传递的std::string参数变为空状态(我的意思是std::string大小为0,并且在调用std::move(std::string)之后,其内部缓冲区指向nullptr)。这是一个示例代码

#include <iostream>
#include <string>

void print(std::string& str) {
    std::cout << "lref\n";
    std::cout << str << "\n" << std::endl;
}

void print(const std::string& str) {
    std::cout << "const lref\n";
    std::cout << str << "\n" << std::endl;
}

void print(std::string&& str) {
    std::cout << "rref\n";
    std::cout << str << "\n" << std::endl;
}

int main() {
    std::string str_a = "Hello, ";
    std::string str_b = "world!";
    
    print(str_a);
    print(str_b);
    print(str_a + str_b);
    
    print(std::move(str_a));
    print(str_a); // was expecting str_a to be empty but still prints Hello, 
    
    return 0;
}

共1个答案

匿名用户

std::move不移动任何内容。要进行实际移动,需要将str作为rvalue-reference传递给另一个字符串的移动构造函数,如下所示。

std::string new_str(std::move(str));
print(str_a);