最近,我一直在阅读这篇文章和帖子建议停止返回const对象.Stephan T. Lavavej在2013年Going Native的演讲中也给出了这个建议.
我写了一个非常简单的测试来帮助我理解在所有这些情况下调用哪个构造函数/运算符:
返回const或非const对象
如果返回值优化(RVO)启动怎么办?
如果命名返回值优化(NRVO)启动怎么办?
这是测试:
#includevoid println(const std::string&s){ try{std::cout< 以下是发布模式下的输出(使用NRVO和RVO):
build a Default Constructor build b Default Constructor Constructor nrvo Default Constructor Constructor cnrvo Default Constructor Constructor rvo Default Constructor Constructor crvo Default Constructor Constructor sum Default Constructor Move Constructor Destructor Constructor csum Default Constructor Move Constructor Destructor Affectation nrvo Default Constructor Move Operator Destructor Affectation cnrvo Default Constructor Copy Operator Destructor Affectation rvo Default Constructor Move Operator Destructor Affectation crvo Default Constructor Copy Operator Destructor Affectation sum Copy Constructor Move Operator Destructor Affectation csum Default Constructor Move Constructor Destructor Copy Operator Destructor Done Destructor Destructor Destructor Destructor Destructor Destructor Destructor Destructor我不明白的是: 为什么在"Constructor csum"测试中使用移动构造函数?
返回对象是const所以我真的觉得应该调用复制构造函数.
我在这里错过了什么?
它不应该是编译器的错误,Visual Studio和clang都会提供相同的输出.