C++ NRV和xFF08;命名返回值);复制构造函数

C++ NRV和xFF08;命名返回值);复制构造函数,c++,compiler-construction,copy-constructor,return-value-optimization,nrvo,C++,Compiler Construction,Copy Constructor,Return Value Optimization,Nrvo,最近,我在读“c++的对象模型内部”,在读第5章时,我提出了以下问题: 即使类具有复制构造函数,编译器也会处理NRVO吗 RVO(或NRVO)是编译器用来消除副本的优化,即防止创建冗余副本。复制构造函数的自定义实现无法阻止应用此优化。答案是“不,它不会阻止。” n3290(C++11草稿),12卷第8章第31节(p284): 当满足某些条件时,允许实现省略类的复制/移动构造 对象,即使该对象的复制/移动构造函数和/或析构函数有副作用 RVO或多或少是在另一个作用域中创建对象,并在读取或写入变量时

最近,我在读“c++的对象模型内部”,在读第5章时,我提出了以下问题:

即使类具有复制构造函数,编译器也会处理NRVO吗

RVO(或NRVO)是编译器用来消除副本的优化,即防止创建冗余副本。复制构造函数的自定义实现无法阻止应用此优化。

答案是“不,它不会阻止。”

n3290(C++11草稿),12卷第8章第31节(p284):

当满足某些条件时,允许实现省略类的复制/移动构造 对象,即使该对象的复制/移动构造函数和/或析构函数有副作用


RVO或多或少是在另一个作用域中创建对象,并在读取或写入变量时使用该对象而不是本地对象。这会导致只创建一个对象,而根本不调用复制构造函数,从而导致您是否声明它不相关。

我认为您的问题是“如果微不足道的复制构造函数会阻止nrvo”, 我的答案是否定的。 我使用了“C++对象模型内部”的例子,让它在FoO函数和主函数中打印成员的地址,结果显示它们在释放模式下是相同的,而在调试模式中没有乐观,在VS2010中。
这意味着NRVO并不关心您是否有一个非平凡的复制构造函数或一个平凡的复制构造函数。

简而言之,您要问的是,一个非平凡的复制构造函数(即可能有副作用的构造函数)的存在是否会禁止编译器执行NRVO(这会删除复制)?是的,我不确定答案