std :: move in return语句

时间:2017-10-10 12:23:51

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

我一直密切关注永远不要在回复声明for example中写std::move的建议。除了有一些边缘情况,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;
}

1 个答案:

答案 0 :(得分:7)

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

相当于

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

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

该函数的返回值是B的临时实例,它是 prvalue 。它是C ++ 17,它将受益于"guaranteed copy elision"。在C ++ 17之前,它将是RVOd或移入其目标。