《深度探索C++对象模型》第二章67页有:
这个程序的第一个版本不能实施NRV优化,因为test class 缺少一个copy constructor.
也就是缺少拷贝构造函数所以不能NRV优化。
NRV优化和拷贝构造函数是有关系的,只有定义了拷贝构造函数才会开启NRV优化,但现代编译器NRV优化的开启一般都与拷贝构造函数没有关系,
早期的 cfront需要一个开关来决定是否应该对代码实行NRV优化,这就是是否有客户(程序员)显式提供的拷贝构造函数:如果客户没有显式地提供拷贝构造函数,那么cfront认为客户对默认的逐位拷贝语义很满意,由于逐位拷贝本身就是很高效的,所有没必要再对其实施NRV优化;但如果客户显式提供了拷贝构造函数,这说明客户由于某些原因(例如需要深拷贝等)摆脱了高效的逐位拷贝语义,其拷贝动作开销将增大,所以将应对其实施NRV 优化,其结果就是去掉并不必要的拷贝函数调用。
NRV优化会导致原本预想中的调用“拷贝构造函数”变成调用别的“构造函数”,
一旦这个时候,拷贝构造函数和别的构造函数提供的功能不同,就可能会出问题。
参考:
https://www.cnblogs.com/cyttina/archive/2012/11/26/2790076.html
https://book.douban.com/annotation/19292671/