#c #c 11 #constructor #move-semantics
#c #c 11 #конструктор #переместить-семантика
Вопрос:
Иногда я сталкиваюсь со следующим типом конструктора.
struct A
{
std::string a;
A( std::string a ) : a( std::move(a) ){ } \ a is not passed by reference
};
Что-то меня смущает в том, что, похоже, это a
не передается по ссылке, поэтому создается копия a
. И если это так, то это бессмысленно делать std::move
. Но многие эксперты, похоже, делают это, так что за этим должна быть причина. Не могли бы вы объяснить, почему?
Комментарии:
1.
a(a)
была бы дополнительная копия,a(std::move(a))
это просто (предположительно дешевый) ход.2.
a(std::move(a))
для меня это имеет смысл. Но мне интересно, почему люди этого не делаютA(std::stringamp; a) : a(std::move(a)) {}
.3. Предположим, у меня есть
std::string str("my string"); A a(str);
. После этой строки,str
станет пустым. Имеет ли это смысл? Я думаю, нет. Я бы не ожидалA a(str);
измененияstr
. Когда вы принимаетеstd::string
по значению, вы могли бы четко указать свое намерение:A a(std::move(str));
. Теперь разумно, чтоstr
становится пустым.
Ответ №1:
Это позволяет избежать второй копии. В противном случае построение локального файла std::string
из std::string
, переданного функции, было бы второй копией.