我在这里看到了这一点: Move Constructor调用基类Move Constructor
有人能解释一下:
std::move和std::forward,优选用一些代码示例?我一直在观看Scott Meyers 关于 C++和2012 年之后的Universal References的演讲,到目前为止一切都很有意义.然而,一位观众在大约50分钟后问了一个问题,我也在想.迈尔斯说,他不关心答案,因为它不是惯用的,会愚蠢的想法,但我仍然感兴趣.
提供的代码如下:
// Typical function bodies with overloading:
void doWork(const Widget& param) // copy
{
// ops and exprs using param
}
void doWork(Widget&& param) // move
{
// ops and exprs using std::move(param)
}
// Typical function implementations with universal reference:
template <typename T>
void doWork(T&& param) // forward => copy and move
{
// ops and exprs using std::forward<T>(param)
}
Run Code Online (Sandbox Code Playgroud)
关键是当我们采用右值引用时,我们知道我们有一个右值,所以我们应该std::move保留它是一个右值的事实.当我们采用通用引用(T&&其中T是推导类型)时,我们希望std::forward保留它可能是左值或右值的事实.
所以问题是:既然 …
c++ rvalue-reference move-semantics perfect-forwarding c++11
我正在尝试从函数构造一个对象,然后将它传递给一个使用它的函数(并使用它).这是代码
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?
Run Code Online (Sandbox Code Playgroud)
我没有直接使用rvalue引用,createObject因为我会返回对deallocated内存的引用.
std::move在代码中指出的部分是否必要?如果像在上面的代码中那样,我传递一个rvalue绑定到右值引用会发生什么?代码似乎编译得很好,但我看不出a之间的区别
consumeObject(createObject());
Run Code Online (Sandbox Code Playgroud)
和
consumeObject(std::move(createObject()));
Run Code Online (Sandbox Code Playgroud)