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

Har*_*rry 2 c++

我有点困惑为什么std::move(std::string)不将传递的std::string参数设置为空状态(我的意思是std::string大小为 0 及其内部缓冲区nullptr在调用后指向std::move(std::string))。这是示例代码

#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;
}
Run Code Online (Sandbox Code Playgroud)

ale*_*ame 5

std::move没有移动任何东西。它将其参数转换为rvalue-reference. 要实际移动,您需要传递strasrvalue-reference来移动另一个字符串的构造函数(或移动赋值),如下所示。

std::string new_str(std::move(str));
print(str);
Run Code Online (Sandbox Code Playgroud)

  • 即使这样,类的移动构造函数或移动赋值运算符也可能选择不实际清除该值,因为按照惯例,移动不必这样做(但他们应该记录他们所做的任何事情) (2认同)