C++11 自动调用移动构造函数

C++11 自动调用移动构造函数,c++11,C++11,我有以下代码示例: 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"); } 我的问题是: 从Registe

我有以下代码示例:

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");
}
我的问题是:

  • 从Register1()调用Register2()时是否需要使用std::move
  • 我需要在Register1()中调用std::move()吗
  • 如果回答问题2。是的,是否可以由一名专门的操作员代替
  • 例如:

    void MyClass::Register2(std::string name, std::string email)
    {
        m_name <= name; // perform move
        m_email <= email; // perform move
    }
    
    void MyClass::Register2(std::string name,std::string email)
    {
    m_名称
    从Register1()调用Register2()时是否需要使用std::move

    是的,因为
    name
    是左值,您希望将其转换为右值


    我需要在Register1()中调用std::move()吗

    是的,原因与上述相同


    如果问题2的答案是肯定的,是否可以由一名专门的操作员代替

    这是可能的,但我不认为它已经被提出。而且,如果它被提出,我认为它不会被接受,因为它不会给std::move带来太多价值

  • 没有
  • std::move
    看起来像这样

    模板
    标准::删除\u引用\u t&&move(t&&value){
    返回静态_cast(值);
    }
    
    它所做的只是将作为参数传递的内容强制转换为右值。这一步非常重要,因为即使传递右值,参数也始终是左值(因为它们有名称)。左值是不可移动的,因此如果不将它们强制转换为右值,移动机制将不会生效,它们将被简单地复制

    运算符是函数,在这种情况下没有例外。没有提出特殊的移动运算符,而且这种情况极不可能出现,因为它会使标准变得更长、更复杂(编译器也会受到严重影响),从而可以节省几个字符