相关疑难解决方法(0)

std :: move和std :: forward之间有什么区别

我在这里看到了这一点: Move Constructor调用基类Move Constructor

有人能解释一下:

  1. 之间的差std::movestd::forward,优选用一些代码示例?
  2. 如何轻松思考,何时使用哪个

c++ perfect-forwarding c++11

155
推荐指数
4
解决办法
4万
查看次数

我可以/通常使用std :: forward而不是std :: move吗?

我一直在观看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

63
推荐指数
2
解决办法
7217
查看次数

在参数构造中使用std :: move

我正在尝试从函数构造一个对象,然后将它传递给一个使用它的函数(并使用它).这是代码

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)

c++ rvalue rvalue-reference c++11

3
推荐指数
1
解决办法
262
查看次数