std::move 在 return 语句中
std::move in return statements
我一直在密切关注永远不要在 return 语句中写 std::move
的建议,for example. Except there are some edge cases, 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;
}
return {std::move(a), std::move(c)}
等同于
return B{std::move(a), std::move(c)}
您基本上是在调用 B::B(A&&, C&&)
而不是采用 const&
引用的版本。这与移动 return 值无关。
函数的return值是B
的临时实例,是一个prvalue。它是 C++17,它将受益于 "guaranteed copy elision"。在 C++17 之前,它将是 RVOd 或移入其目标。
我一直在密切关注永远不要在 return 语句中写 std::move
的建议,for example. Except there are some edge cases, 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;
}
return {std::move(a), std::move(c)}
等同于
return B{std::move(a), std::move(c)}
您基本上是在调用 B::B(A&&, C&&)
而不是采用 const&
引用的版本。这与移动 return 值无关。
函数的return值是B
的临时实例,是一个prvalue。它是 C++17,它将受益于 "guaranteed copy elision"。在 C++17 之前,它将是 RVOd 或移入其目标。