【发布时间】:2018-04-17 07:03:38
【问题描述】:
有代码
string one = "one";
string two{ one };
string three{ move(one)};
cout << one << endl;
这会打印“”。这是因为调用了字符串 3 的移动构造函数并窃取了它的参数值。但是,变量一是怎么修改的呢?
当我们通过move(one) 时返回右值。并且移动构造函数从那个右值窃取资源,变量一没有作为引用或指针传递在那里。那么这种行为是怎么发生的呢?
感谢回答
【问题讨论】:
-
move(one)给你一个右值reference。 -
“变量 one 没有作为引用或指针传递。” - 是的。
std::move()不会创建一个临时的它执行类型转换。所以右值是one从左值转换为右值引用 -
构造函数如何知道你保留了一个引用?您使用 move(one) 明确指定将所有权传递给构造函数,因此该行为是合法的
-
明确地说,
std::move(arg)只是一个演员表。改变参数的是std::string的构造函数。这正是std::move的用途——避免复制字符串数据。
标签: c++ c++11 move-semantics