у меня есть class
как это:
class Widget
{
public:
Widget(A const& a) { /* do something */ }
Widget(A&& a) { /* do something */ }
};
Который я могу использовать так:
A a{};
Widget widget{a};
Если я пришел к выводу, что мне не нужно a
больше я мог бы позвонить:
Widget{std::move(a)};
Но что теперь, если мне нужен A
объект только для строительства widget
? Буду ли я делать это:
Widget widget{A{}};
или же
Widget widget{std::move(A{})};
Временное — это значение; нет «временных значений». Widget widget{A{}};
позвоню Widget(A&& a)
как A{}
является временным. std::move
используется, когда у вас есть lvalue, и вы хотите сделать его rvalue, как вы делаете с:
A a{};
Widget widget{std::move(a)};
Еще одна причина использовать его, если вы находитесь в функции, которая принимает значение r, и вы хотите переместить его в конструктор. С функцией
Widget foo(A&& a);
a
является lvalue в теле функции. Если вы хотите преобразовать его обратно в r-значение, вам нужно использовать std::move
лайк
Widget foo(A&& a)
{
Widget widget{std::move(a)};
}
Других решений пока нет …