【发布时间】:2015-11-30 11:29:48
【问题描述】:
我正在尝试从一个函数构造一个对象,然后将它传递给一个使用它(并使用它)的函数。这是代码
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 的右值引用,因为我会返回对已释放内存的引用。
std::move 在代码中指示的部分是否必要?如果像我在上面的代码中所做的那样,我传递一个右值以绑定到右值引用会发生什么?代码似乎编译得很好,但我看不出 a 之间的区别
consumeObject(createObject());
和
consumeObject(std::move(createObject()));
【问题讨论】:
-
您的代码错误:
createObject返回unique_ptr<Object>,但consumeObject采用Object。你能解决这个问题吗? -
return std::move(myobj);中的移动禁止 NRVO,只需执行return myobj;。 -
您应该使用 MCVE 进行实际测试。否则有什么意义呢? (郑重声明,这不是 MCVE。)
-
std::forward在这种情况下零意义(并且您忘记在问题中更改其模板参数)。std::move就可以了。 -
@LightnessRacesinOrbit 我主要是想开个玩笑。我对移动语义的无知感到非常无聊和沮丧
标签: c++ c++11 rvalue-reference rvalue