Являются ли временные lvalues ​​сценарием использования для std :: move

у меня есть 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{})};

1

Решение

Временное — это значение; нет «временных значений». 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)};
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]