我有点困惑为什么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)
std::move没有移动任何东西。它将其参数转换为rvalue-reference. 要实际移动,您需要传递strasrvalue-reference来移动另一个字符串的构造函数(或移动赋值),如下所示。
std::string new_str(std::move(str));
print(str);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |