2011-09-28 4 views
3

현재 저는 rvalue reference (C++ 11, g ++와 g ++ ++ x0)를 가지고 놀고 있습니다. 그리고 클래스에 move semantics를 구현하고 싶습니다. 왜냐하면 "right"라고 느끼기 때문입니다.rvalue 참조에 대해 const lvalue reference를 명시 적으로 허용하는 메서드를 명시 적으로 오버로드해야합니까?

일반적으로 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); 
} 

이것은 매우 불필요한 것 같습니다. 더 쉽게 구현할 수있는 방법이 있습니까?

감사합니다.

(나는 종종 유래 읽을 수 있지만 이것이 내 첫 번째 질문입니다. 그래서 내가 뭔가 잘못하고있어 경우 나 힌트를주세요.)

답변

5

쓰기를 하나 개의 함수를. 가치로 받아 들인 다음 이동하십시오.

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

자체를 복사하는 방법을 std :: string에서 결정하게하십시오.

+3

불행히도 매개 변수 유형이 이동을 지원하는지 확인해야합니다. 그렇지 않으면 두 개의 복사본이 생성됩니다. 함수를 템플릿으로 변환하지 않고 일반적으로이 작업을 수행 할 수 있습니까? – avakar

+0

매개 변수가 이동 의미를 지원하는 한이 솔루션은 완벽하게 작동합니다. 최악의 경우 (lvalue 참조를 전달)에는 최소한의 오버 헤드 (추가로 하나의 이동 할당이 있으므로 매우 저렴합니다) 만 소개합니다. 나는 그것을 좋아한다. 감사 –

관련 문제