конструктор с std:: переместить без передачи по ссылке

#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 , переданного функции, было бы второй копией.