5

現在、私は右辺値参照 (C++11、gnu++x0 を使用した g++) をいじっていますが、クラスに移動セマンティクスを実装したいと考えています。

右辺値参照の恩恵を受けるには、通常は 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;
}

セッターを右辺値参照で使用し、不要なコピーを削除したいと考えています。

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

このようにすべてのメソッドをオーバーロードする必要は本当にありますか?

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

これは私には非常に冗長に思えます。これを簡単に実装する方法はありますか?

ありがとう!

(私はスタックオーバーフローをよく読んでいますが、これは私の最初の質問です。何か間違ったことをしている場合はヒントを教えてください。)

4

1 に答える 1

5

1つの関数を記述します。値で取り込んでから移動します。

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

std::stringにそれ自体をコピーする方法を決定させます。

于 2011-09-28T17:27:49.257 に答える