关于 std::move 行为
About std::move behavior
我玩了一会儿std::move
,我注意到一些奇怪的事情:
string && foo(string && x) {
string && a = move(x);
return move(a); //both x and a = "asdfgh"
}
int main(){
string x,aa;
aa = "asdfgh";
x = foo(move(aa));
//aa = "", x = "asdfgh"
aa = "asdf";
x = move(aa);
//aa = "", x ="asdf"
}
main
的行为很清楚,但为什么在调用move
之后foo
,x
不为空?为什么它没有从x
"偷">
因为,在foo
中,a
是一个 r 值引用。 a
和局部变量x
是同一个对象。
请参阅此代码:-
int main()
{
string aa;
aa = "asdf";
string &&x = move(aa);
x[0]='b';
cout<<boolalpha<<aa<<'t'<<aa.empty()<<'n';
string y = move(aa);
y[0]='c';
cout<<aa<<'t'<<aa.empty()<<'n';
return true;
}
输出:-
bsdf false
true
显然,x
是aa
而不是不同对象的rvalue reference
(这就是为什么在改变x
时aa
发生了变化(。因此,aa
没有被清空。然而另一方面,y
是与aa
不同的对象,因此std::move
语句清空aa
。
因此,foo
函数中的代码显示了类似的行为。由于foo
中的x
和a
rvalue references
aa
,您的代码不会清空aa
。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- arr[-1]在c++中的奇怪行为
- 继承期间显示未知行为的子类
- 如何在c++中使用引用实现类似python的行为
- G锁定铸造到基础上会释放模拟行为
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 5 与 std::move(5) 的行为差异
- 成员函数与 std::move(*this) 的行为差异
- 为什么 std::move 的行为类似于 std::copy
- std::move 操作在 c++11 中的行为
- copy-/move-constructors的奇怪行为以及如何返回大对象?
- 关于 std::move 行为
- std::move在vector::insert和push_back上的行为不同
- 理解本例中的move构造函数行为
- std::move的未定义行为