1

例如,我一直密切关注永远不要写std::move在退货声明中建议。除了有一些边缘情况,例如.

我相信以下是另一个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;
}
4

1 回答 1

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

相当于

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

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

函数的返回值是 的临时实例B,它是一个纯右值。在 C++17 中,它将受益于“保证复制省略”。在 C++17 之前,它将被 RVOd 或移动到其目标中。

于 2017-10-10T12:29:03.177 回答