自动调用move构造函数

时间:2018-07-18 10:16:46

标签: 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");
}

我的问题是:

  1. 从Register1()调用Register2()时是否需要使用std :: move?
  2. 我需要在Register1()中调用std :: move()吗?
  3. 如果问题2的答案为“是”,那么可以改为有专门的运算符吗?

例如:

void MyClass::Register2(std::string name, std::string email)
{
    m_name <= name; // perform move
    m_email <= email; // perform move
}

2 个答案:

答案 0 :(得分:0)

  

从Register1()调用Register2()时需要使用std :: move吗?

是的,因为name左值,并且您想将其转换为右值


  

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

是,出于与上述相同的原因。


  

如果问题2的答案是“是”,那么可以改用专门的运算符吗?

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

答案 1 :(得分:0)

std::move看起来像这样

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

它所做的只是将您传递的内容作为参数传递给右值。此步骤至关重要,因为即使传递了右值,参数也始终是左值(因为它们具有名称)。左值是不可移动的,因此,如果不将它们强制转换为右值,则移动机制不会起作用,它们将被简单地复制。

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