系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
18.2.3 移动构造函数解析
虽然使用右值引用可支持移动语义,但这并不会神奇地发生。要让移动语义发生,需要两个步骤。首先,右值引用让编译器知道何时可使用移动语义:
Useless two one;/matches Useless::Useless(const Useless &)
Useless four(one +three)://matches Useless::Useless(Useless &&)
对象 one是左值,与左值引用匹配,而表达式one+three是右值,与右值引用匹配。因此,右值引用让编译器使用移动构造函数来初始化对象four。实现移动语义的第二步是,编写移动构造函数,使其提供所需的行为。总之,通过提供一个使用左值引用的构造函数和一个使用右值引用的构造函数,将初始化分成了两组使用左值对象初始化对象时,将使用复制构造函数,而使用右值对象初始化对象时,将使用移动构造函数。程序员可根据需要赋予这些构造函数不同的行为。
这就带来了一个问题:在引入右值引用前,情况是什么样的呢?如果没有移动构造函数,且编译器未能通过优化消除对复制构造函数的需求,结果将如何呢?在C++98中,下面的语句将调用复制构造函数:
Useless four (one +three)