1

У меня есть class так:ли временные lvalues ​​Прецедент для станд :: ход

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{})}; 
+2

Я не могу видеть «временный» именующее выражение. 'A {}' является rvalue, поэтому он перегружает разрешение, забирает конструктор перемещения. – juanchopanza

+0

Я думаю, вы хотели написать 'Виджет виджетов {std :: move (a)};' в случае * или *. – nwp

+1

Тогда как получилось 'A {} = A {};' является допустимым выражением? – hgiesel

ответ

4

Временный является Rvalue; нет «временных значений». Widget widget{A{}}; будет звонить по номеру Widget(A&& a), так как A{} является временным. std::move используется, когда у вас есть Левое и вы хотите сделать его RValue как вы делаете с:

A a{}; 
Widget widget{std::move(a)}; 

Еще одна причина, чтобы использовать его было бы, если вы находитесь в функции, которая принимает RValue и вы хотите переместить это к конструктору. С помощью функции

Widget foo(A&& a); 

a является именующим в теле функции. Если вы хотите, чтобы преобразовать его обратно в RValue, то вам нужно будет использовать std::move как

Widget foo(A&& a) 
{ 
    Widget widget{std::move(a)}; 
} 
Смежные вопросы