将std ::字符串移至功能参数
Move a std::string to function param
我想将一个大的std ::字符串移至班级成员。
这是我的代码:
#include <cassert>
#include <string>
#include <iostream>
using namespace std;
class SomeClass {
public:
void some_method(std::string&& str) {
my_str = str;
}
std::string my_str;
};
int main() {
SomeClass some_class;
std::string large_str(100000, 'a');
some_class.some_method(std::move(large_str));
assert(large_str.empty());
assert(!some_class.my_str.empty());
return 0;
}
移动后,我预计large_str
是空的,但是此代码在assert(large_str.empty())
行中失败。
我是否误解了std::move
的语义?
我是否误解了
std::move
的语义?
部分,是的。您忘了将功能参数str
施加到rvalue。在some_method
中,它再次成为LVALUE。要解决这个问题:
void some_method(std::string&& str) {
my_str = std::move(str);
// ^^^^^^^^^ Necessary: invoke std::move a 2nd time
}
,但请注意以下内容。您应该使用assert
的"移动" std::string
对象。从这里,Overload#8(重点是我的):
移动构造函数。使用移动语义构建字符串的内容。另一个留在有效中,但未指定的状态。
您不希望您的程序取决于未指定的状态(即使碰巧特定的实现使std::string::size
返回0之后,其资源消费后也会返回0)。
相关文章:
- 如何在C++中调用默认模板功能参数?
- 为什么指定数据类型而不是构造功能参数?C
- 为什么在相同大小的功能参数中隐式转换不会发出警告
- 无全局变量或功能参数的递归调用
- 将功能参数添加到向量
- 使用ENABLE_IF和SFINAE时,功能参数类型扣除(std容器,例如向量)失败
- C 功能参数中的返回参数
- 将std ::字符串移至功能参数
- 可以在功能参数列表中多次使用函数模板的模板参数名称
- C 元组类型用于功能参数类型
- 功能参数包
- 我可以使用模板功能参数C 更改模板类型
- 为了支持移动语义,应通过unique_ptr,值或rvalue获取功能参数
- 创建模板函数以使用该功能参数调用其他函数
- C 功能参数扩展了多个类
- GDB CoreFile不查看功能参数
- 功能参数导致堆栈溢出
- C 在功能参数中指向基类指针的指针
- 功能参数转换为儿童类C
- 功能参数与函数调用不匹配