【问题标题】:std::move in return statementsstd::move 在返回语句中
【发布时间】:2018-03-21 20:36:33
【问题描述】:

我一直密切关注不要在退货声明中写std::move 的建议for example。除了有一些边缘情况,for example

我相信以下是std::move 可能值得的另一个简单示例 - 我错过了什么吗?但我不知道为什么,这在未来的 C++ 中会改变吗?

#include <iostream>

struct A
{
};

struct C
{
};

struct B
{
    B(const A&, const C&) { std::cout << "B was copied\n"; }
    B(A&&, C&&) { std::cout << "B was moved\n"; }
};

B f()
{
    A a;
    C c;
    //return {a, c}; // Gives "B was copied"
    return {std::move(a), std::move(c)}; // Gives "B was moved"
}

int main() {
    f();
    return 0;
}

【问题讨论】:

  • 您不是在尝试强制移动返回的对象,而是在构建它。这与建议无关。
  • 那些不同的构造函数与B被移动或复制没有任何关系。
  • 您的代码与return std::move(x); 完全不同。你这里搬什么其实和回报没什么关系
  • 移动或复制的不是B,而是AC。是你的文字不正确。

标签: c++ c++11 move-semantics rvo


【解决方案1】:
return {std::move(a), std::move(c)}

等价于

return B{std::move(a), std::move(c)}

您基本上是在调用 B::B(A&amp;&amp;, C&amp;&amp;) 而不是采用 const&amp; 引用的版本。这与移动返回值无关。

函数的返回值是B的临时实例,是一个prvalue。它是 C++17,它将受益于"guaranteed copy elision"。在 C++17 之前,它将被 RVOd 或移动到它的目标中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 2012-03-20
    • 1970-01-01
    • 2013-04-05
    • 2011-07-28
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多