1

関数呼び出しがあります

class MyClass {
    static std::string getName(void) {
        return getMyName(void); // Returning by value as well
    }
};

クラスのコンストラクターでこの関数を使用すると

class AnotherClass {
public:
    AnotherClass(void) :
        m_name(std::move(MyClass::getName())) {} // 1. std::move used

    const std::string& name(void) const {   // 2. Should I use std::string&& (without consts)
                                            //    .... but I also need to make sure value cannot be changed (e.g, name() = "blah";)
                                            //    if std::string&& will be used should I use it simply by calling name() to call function using move or should I leave it as is?
        return m_name;
    }
private:
    std::string m_name;
}

これは移動セマンティクスの正しい使用法ですか? 関数が移動セマンティクスを使用していることを確認するにはどうすればよいですか?

セマンティクスを移動することで効率を実装することを学ぼうとしているので、ばかげた質問であれば申し訳ありません。

確認しました

移動セマンティクスとは

http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html

これは C++ の「移動」セマンティクスの正しい使用法ですか?

素晴らしい説明ですが、関数が移動セマンティクスを使用しているかどうかを確認するための明確化が必要です。

4

1 に答える 1

2

ここで使用する必要はありませんstd::move:

   m_name(std::move(MyClass::getName())) {} // no need to use std::move

getName()すでに右辺値であるコピーを返します。

通常のようにこれを行うだけです:

   m_name(MyClass::getName()) {}

移動コンストラクターは、必要に応じて自動的に使用されます。(コンパイラは、コピーを完全に省略して、 の戻り値を にMyClass::getName()直接構築する可能性がm_nameあります。これはさらに優れています)。

これに関しては:

const std::string& name() const { return m_name; }

ここでも特別なことをする必要はありません。m_name変更されたくないのでstd::move、を使用しないでください。通常の const 左辺値参照を使用する必要があります。

必要な最も一般的な状況はstd::move、独自のムーブ コンストラクターを作成する場合です。

class AnotherClass {
public:
    AnotherClass(AnotherClass &&that) :
        m_name(std::move(that.m_name))
    {
    }
};

これは、thatが右辺値参照として宣言されていても、コンストラクター内ではthat通常の左辺値参照のように動作するためです。

于 2013-07-22T01:20:46.883 に答える