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");
}
我的问题是:
- 从 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
}
解决方案
- 是的
- 是的
- 不
std::move
看起来像这样
template<typename T>
std::remove_reference_t<T>&& move(T&& value) {
return static_cast<std::remove_reference_t<T>&&>(value);
}
它所做的只是将你作为参数传递的东西转换为右值。这一步是必不可少的,因为参数,即使您传递一个右值,也始终是左值(因为它们有名称)。左值是不可移动的,因此如果你不将它们转换为右值,移动机制将不会启动,它们将被简单地复制。
运算符是函数,在这种情况下也不例外。特殊动作运算符尚未提出,而且极不可能提出,因为它会使标准变得更长、更复杂(编译器也会受到严重影响),以节省几个字符。