Нужно ли перегружать методы, явно принимающие константную ссылку на lvalue для ссылок на rvalue? - PullRequest
5 голосов
/ 28 сентября 2011

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

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

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

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, но это мой первый вопрос. Поэтому, пожалуйста, дайте мне подсказку, если я делаю что-то не так.)

1 Ответ

5 голосов
/ 28 сентября 2011

Написать одну функцию. Возьмите его по значению, затем переместите.

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

Пусть std :: string решает, как копировать себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...