Нужно ли мне перегрузить методы, принимающие ссылку const lvalue для ссылок rvalue?

в настоящее время я играю со ссылкой на rvalue (C ++ 11, g ++ с gnu ++ x0), и я хочу реализовать семантику перемещения в своих классах, потому что это просто кажется "верно".

Нужно ли мне перегружать каждую функцию, которая обычно принимает ссылку на const lvalue, чтобы получить выгоду от ссылок rvalue?

Допустим, это мой пример класса:

class Person {
public:
    Person() = default;
    Person(std::string &name);
    Person(const Person &rhs);
    Person(Person &&rhs);

    Person& operator=(const Person &rhs);
    Person& operator=(Person &&rhs);

    std::string& get_name() const;
    void set_name(const std::string &name);
private:
    std::string name_;
}

/* snip */

void Person::set_name(const std::string &name)
{
    this->name_ = name;
}

Теперь я хочу использовать установщик со ссылками на rvalue и исключить ненужные копии.

Person test("Jon Doe");
test.set_name("Jon Doe2");

Действительно ли мне нужно таким образом перегружать каждый метод?

void Person::set_name(std::string &&name)
{
    this->name_ = std::move(name);
}

Мне это кажется слишком избыточным. Есть ли способ сделать это проще?

Спасибо!

(Я часто читаю stackoverflow, но это мой первый вопрос. Пожалуйста, дайте мне подсказку, если я делаю что-то не так.)

5
задан Stefan Haller 28 September 2011 в 17:20
поделиться