C ++ 11 - 在构造函数中移动基础数据类型?

时间:2014-07-17 10:17:39

标签: c++11 move-semantics

我正在研究C ++ 11中的移动语义,我很好奇如何在构造函数中移动基本类型,如boolean,integer float等。复合类型也像std :: string。

以下面的课程为例:

class Test
{
public:
    // Default.
    Test()
        : m_Name("default"), m_Tested(true), m_Times(1), m_Grade('B')
    {
        // Starting up...
    }
    Test(const Test& other)
        : m_Name(other.m_Name), m_Times(other.m_Times)
        , m_Grade(other.m_Grade), m_Tested(other.m_Tested)
    {
        // Duplicating...
    }
    Test(Test&& other)
        : m_Name(std::move(other.m_Name)) // Is this correct?
    {
        // Moving...
        m_Tested = other.m_Tested; // I want to move not copy.
        m_Times = other.m_Times; // I want to move not copy.
        m_Grade = other.m_Grade; // I want to move not copy.
    }

    ~Test()
    {
        // Shutting down....
    }

private:
    std::string     m_Name;
    bool            m_Tested;
    int             m_Times;
    char            m_Grade;
};

如何移动(不复制)m_Tested,m_Times,m_Grade。并且m_Name是否正确移动?谢谢你的时间。

2 个答案:

答案 0 :(得分:6)

从prvalue或xvalue原语初始化和赋值,与初始化或从左值原语赋值完全相同;复制值并且源对象不受影响。

换句话说,您可以使用std::move,但它不会有任何区别。

如果你想改变源对象的值(比如说0),你必须自己做。

答案 1 :(得分:1)

看起来正确。除了像bool这样的简单数据类型,int,char只能被复制。 “移动”一个字符串的要点是它有一个缓冲区,它通常在构造一个新对象时必须复制,但是当移动旧缓冲区时(复制指针而不是缓冲区的内容)。

Test(Test&& other)
    : m_Name(std::move(other.m_Name)), m_Times(other.m_Times)
    , m_Grade(other.m_Grade), m_Tested(other.m_Tested)
{}