std::move 在参数构造中的使用
Use of std::move in parameter construction
我试图从一个函数构造一个对象,然后将它传递给一个使用它(并使用它)的函数。这是代码
std::unique_ptr<Object> createObject() {
auto myobj = std::make_unique<Object>();
.. modify myobj ..
return std::move(myobj);
}
void consumeObject(std::unique_ptr<Object>&& robj) {
myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}
consumeObject(createObject()); // Is this right?
我没有直接从 createObject
使用右值引用,因为我会 return 对已释放内存的引用。
代码中指出的部分是否需要std::move
?如果像我在上面的代码中所做的那样,传递一个右值以绑定到右值引用,会发生什么情况?代码似乎编译得很好,但我看不出 a
之间的区别
consumeObject(createObject());
和
consumeObject(std::move(createObject()));
std::move
没有做任何魔术,它只是将参数转换为右值。
由于 createObject
returns 按值计算,createObject()
已经是一个右值(特别是纯右值),因此 std::move
在这种情况下是不必要的,您可以安全地省略它。
std::unique_ptr<Object> createObject() {
auto myobj = std::make_unique<Object>();
.. modify myobj ..
return std::move(myobj);
}
您不需要 std::move
到 return 一个本地的、只能按值移动的对象。
void consumeObject(std::unique_ptr<Object>&& robj) {
myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}
使用 std::forward
没有任何意义*,除非您使用所谓的 "forwarding references",而您不在此处。拥有 &&
并不意味着您应该使用 std::forward
。此外,您根本不需要 &&
。
consumeObject(createObject()); // Is this right?
是的。
下面是代码可能应该看起来的样子。请注意,您主要避免任何 C++11 特定语法,而是代码看起来与按值传递可复制对象几乎相同。这里只有一个地方需要新东西。
std::unique_ptr<Object> createObject() {
auto myobj = std::make_unique<Object>();
.. modify myobj ..
return myobj;
}
void consumeObject(std::unique_ptr<Object> robj) {
myvector.emplace_back(std::move(robj));
}
consumeObject(createObject());
* std::forward
和 std::move
都只是演员表,您在这里使用 std::forward
的方式恰好可以得到正确的演员表以获得移动构造。但是为了可读性,应该只使用 std::move
移动并且只使用 std::forward
转发。
我试图从一个函数构造一个对象,然后将它传递给一个使用它(并使用它)的函数。这是代码
std::unique_ptr<Object> createObject() {
auto myobj = std::make_unique<Object>();
.. modify myobj ..
return std::move(myobj);
}
void consumeObject(std::unique_ptr<Object>&& robj) {
myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}
consumeObject(createObject()); // Is this right?
我没有直接从 createObject
使用右值引用,因为我会 return 对已释放内存的引用。
代码中指出的部分是否需要std::move
?如果像我在上面的代码中所做的那样,传递一个右值以绑定到右值引用,会发生什么情况?代码似乎编译得很好,但我看不出 a
consumeObject(createObject());
和
consumeObject(std::move(createObject()));
std::move
没有做任何魔术,它只是将参数转换为右值。
由于 createObject
returns 按值计算,createObject()
已经是一个右值(特别是纯右值),因此 std::move
在这种情况下是不必要的,您可以安全地省略它。
std::unique_ptr<Object> createObject() {
auto myobj = std::make_unique<Object>();
.. modify myobj ..
return std::move(myobj);
}
您不需要 std::move
到 return 一个本地的、只能按值移动的对象。
void consumeObject(std::unique_ptr<Object>&& robj) {
myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}
使用 std::forward
没有任何意义*,除非您使用所谓的 "forwarding references",而您不在此处。拥有 &&
并不意味着您应该使用 std::forward
。此外,您根本不需要 &&
。
consumeObject(createObject()); // Is this right?
是的。
下面是代码可能应该看起来的样子。请注意,您主要避免任何 C++11 特定语法,而是代码看起来与按值传递可复制对象几乎相同。这里只有一个地方需要新东西。
std::unique_ptr<Object> createObject() {
auto myobj = std::make_unique<Object>();
.. modify myobj ..
return myobj;
}
void consumeObject(std::unique_ptr<Object> robj) {
myvector.emplace_back(std::move(robj));
}
consumeObject(createObject());
* std::forward
和 std::move
都只是演员表,您在这里使用 std::forward
的方式恰好可以得到正确的演员表以获得移动构造。但是为了可读性,应该只使用 std::move
移动并且只使用 std::forward
转发。