2011-09-28 42 views
3

目前我正在玩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; 
} 

我現在想用用右值引用的setter和消除不必要的副本。

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

我真的需要重載每種方法嗎?

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

這對我來說似乎很重複。有什麼方法可以更容易地實現嗎?

謝謝!

(我讀計算器的時候,但是這是我的第一個問題。所以,請給我暗示,如果我做錯了什麼。)

回答

5

寫一個函數。把它放在價值中,然後移動它。

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

讓std :: string決定如何複製自己。

+3

不幸的是,你需要確保參數類型支持移動,否則你最終會得到兩個副本。有沒有辦法一般地做到這一點,而無需將功能轉換爲模板? – avakar

+0

只要參數支持移動語義,該解決方案就可以完美工作。在最糟糕的情況下(通過左值引用)它只會引入最少的開銷(一個額外的移動任務,所以非常便宜)。我喜歡。謝謝 –

相關問題