8.5.3 命名的对象是lvalue(3)
如果有办法在CMessage类的移动赋值和移动构造函数中强制aMess.text成为一个rvalue,就可以修复这些效率低下的问题。C++(www.cppentry.com)库中的utility头文件特意提供了std::move()函数,它所完成的工作完全符合我们的期望。此函数返回作为rvalue传递给它的任何实参。可以像下面这样更改CMessage移动构造函数:
- CMessage(CMessage&& aMess)
- {
- cout << "CMessage move constructor called." << endl;
- text = std::move(aMess.text);
- }
现在,赋值语句右边是一个rvalue,此语句设置新对象的文本成员,所以调用CText类中的移动赋值运算符函数,而不是复制赋值运算符函数。
可以用相似的方式修改移动赋值运算符函数:
- CMessage& operator=(CMessage&& aMess)
- {
- cout << "CMessage move assignment operator function called." << endl;
- text = std::move(aMess.text);
- return *this; // Return a reference to 1st operand
- }
std::move()函数在utility头文件中声明,所以需要在此示例中添加它的#include指令。如果重新编译程序并再次执行它,则从输出可以看到,已经修改的两个函数调用了CText移动赋值运算符函数。在类中实现构造函数和赋值运算符函数以便它们使用std::move()函数被称为移动语义。