是否需要重载接受const左值引用的方法来显式地进行右值引用?

Do I need to overload methods accepting const lvalue reference for rvalue references explicitly?

本文关键字:引用 方法 重载 const 是否      更新时间:2023-10-16

目前我正在玩右值引用(c++ 11, g++与gnu++x0),我想在我的类中实现移动语义,因为它只是感觉"正确"。

我是否需要重载每个通常会接受const左值引用的函数来从右值引用中受益?

假设这是我的示例类:

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;
}

我现在想对右值引用使用setter,并消除不必要的复制。

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

我真的需要这样重载每个方法吗?

void Person::set_name(std::string &&name)
{
    this->name_ = std::move(name);
}
这对我来说似乎很多余。有什么方法可以更容易地实现这一点吗?

谢谢!

我经常阅读stackoverflow,但这是我的第一个问题。所以如果我做错了什么请给我提示

写一个函数。按值取值,然后移动。

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

让std::string决定如何复制自己