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()直接构造 into的返回值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 回答