首页 > 解决方案 > 自动调用移动构造函数

问题描述

我有以下代码示例:

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
}

标签: c++11

解决方案


  1. 是的
  2. 是的

std::move看起来像这样

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

它所做的只是将你作为参数传递的东西转换为右值。这一步是必不可少的,因为参数,即使您传递一个右值,也始终是左值(因为它们有名称)。左值是不可移动的,因此如果你不将它们转换为右值,移动机制将不会启动,它们将被简单地复制。

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


推荐阅读