代码之家  ›  专栏  ›  技术社区  ›  AndreiM

自动调用移动构造函数

  •  0
  • AndreiM  · 技术社区  · 6 年前

    我有以下代码示例:

    void MyClass::Register2(std::string name, std::string email)
    {
        m_name = std::move(name);
        m_email = std::move(email);
    }
    
    void MyClass::Register1(std::string name)
    {
         Register2(std::move(name), "invalid_email");
    }
    

    我的问题是:

    1. 是否需要使用STD::从RealSt1()调用CistRe2()时移动?
    2. 我需要在StReSt1()内部调用STD::
    3. 如果问题2的答案。是的,是否可以有一个专门的操作员代替?

    例如:

    void MyClass::Register2(std::string name, std::string email)
    {
        m_name <= name; // perform move
        m_email <= email; // perform move
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Vittorio Romeo    6 年前

    是否需要使用STD::从RealSt1()调用CistRe2()时移动?

    是的,因为 name 是一个 左值 你想把它变成 价值 .


    我需要在StReSt1()内部调用STD::

    是的,原因与上述相同。


    如果问题2的答案。是的,是否可以有一个专门的操作员代替?

    这是可能的,但我不认为有人提出过。另外,如果要提议的话,我认为它不会被接受,因为它不会带来太多的价值。 std::move .

        2
  •  0
  •   An0num0us parreirat    6 年前
    1. 是的
    2. 是的

    std::move 看起来像这样

    template<typename T>
    std::remove_reference_t<T>&& move(T&& value) {
        return static_cast<std::remove_reference_t<T>&&>(value);
    }
    

    它所做的就是将作为参数传递给右值的东西强制转换。这一步非常重要,因为参数,即使传递一个右值,也始终是左值(因为它们有名称)。lvalues是不可移动的,因此如果您不将它们强制转换为右值,移动机制将不会介入,它们将被简单地复制。

    运算符是函数,在这种情况下没有例外。特殊的移动操作还没有被提出,而且非常不可能,因为它会使标准的更长和更复杂(编译器也会受到严重影响),为一个节省几个字符的功能。