我有以下代码示例:
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");
}
我的问题是:
例如:
void MyClass::Register2(std::string name, std::string email)
{
m_name <= name; // perform move
m_email <= email; // perform move
}
答案 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);
}
它所做的只是将您传递的内容作为参数传递给右值。此步骤至关重要,因为即使传递了右值,参数也始终是左值(因为它们具有名称)。左值是不可移动的,因此,如果不将它们强制转换为右值,则移动机制不会起作用,它们将被简单地复制。
运算符是函数,在这种情况下没有例外。尚未提出特殊的移动运算符,并且极不可能出现,因为对于节省几个字符的功能,它会使标准变得更长,更复杂(编译器也会受到严重影响)。