【问题标题】:Do I need to overload methods accepting const lvalue reference for rvalue references explicitly?我是否需要重载为右值引用明确接受 const 左值引用的方法?
【发布时间】:2011-09-28 17:20:22
【问题描述】:

目前我正在玩右值引用(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,但这是我的第一个问题。所以如果我做错了什么,请给我提示。)

【问题讨论】:

    标签: c++ overloading rvalue-reference


    【解决方案1】:

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

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

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

    【讨论】:

    • 不幸的是,您需要确保参数类型支持移动,否则您最终会得到两个副本。有没有办法在不将函数转换为模板的情况下通用地做到这一点?
    • 只要参数支持移动语义,这个解决方案就可以完美运行。在最坏的情况下(传递左值引用)它只会引入最小的开销(一个额外的移动分配,非常便宜)。我喜欢。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2017-03-26
    • 1970-01-01
    • 2017-05-09
    • 2011-12-06
    • 1970-01-01
    • 2017-04-13
    • 2017-12-03
    相关资源
    最近更新 更多