【发布时间】:2019-02-20 13:08:14
【问题描述】:
考虑这段代码:
class A {
private:
std::string data;
public:
void set_data(std::string&& data) {
this->data = std::move(data); // line 6
}
};
int main() {
std::string move_me = "Some string";
A a;
a.set_data(std::move(move_me)); // line 13
}
我知道我们需要在第 13 行调用 std::move() 以便它将左值转换为右值引用(这听起来正确吗?我是新手)。
但是,在第 6 行,我们需要再次使用std::move() 吗?我假设不会,因为我们已经传递了一个右值引用,并且将调用std::string 的移动构造函数。对吗?
【问题讨论】:
-
左值本质上是一个命名变量,因此第 6 行的
data是一个左值,必须重铸。 -
@OZ17 在没有转发引用的情况下使用
forward没有多大意义。 -
@OZ17
std::forward和std::move不一样。您应该只使用std::forward作为templatecv-unqualified rvalue reference 传递的内容。set_data方法中没有template参与 -
@bobl 是的,没错! This talk Scott Meyers (链接应该带有时间戳,但它已损坏,它是 16 分 44 秒)很好地解释了它。问题是
T&&不一定总是意味着右值引用(这是一个谎言,但这是一个舒服的谎言)。有时,由于引用折叠,它成为左值引用,std::forward'检测到它`并进一步转发正确的类型(左值或右值引用) -
那我很对不起你。这意味着您和您的同事不知道
std::forward确实并且更喜欢编写表达与预期不同的东西的代码。我建议您从我上面链接 3 cmets 的演讲中了解更多关于std::move和std::forward之间的区别
标签: c++ stl move move-semantics