【发布时间】:2015-08-07 07:03:12
【问题描述】:
复制省略在这种情况下会起作用吗?换句话说,具有复制省略的现代编译器是否避免在这里调用任何复制构造函数?
class BigObj{};
BigObj fun()
{
BigObj b;
return b;
}
int main()
{
BigObj *pb = new BigObj(fun());
}
我的目标是将对象存储在指针中。对象由函数返回。我想保存它而不复制它。
我不能使用 c++11
【问题讨论】:
-
@juanchopanza,他可能在提问时混淆了语言。他的意思是,在创建
new BigObj(..)时,不需要复制从fun()返回的对象。而是使用相同的对象。 -
感谢指出这句话很容易被误解,希望我能改正。
-
@ddriver,RVO 在
fun()的情况下确实会启动,但在调用new BigObj(..)时会创建一个新副本。这可以通过在class BigObj中使用移动构造函数来避免。 See my answer. -
“复制省略”和“RVO”不是一回事。 “复制省略”删除中间临时。 “RVO”(或更准确地说,在这种情况下是“NRVO”)可能会完全删除
b和所有复制。那么,这个问题应该是关于什么的呢?复制省略?还是 [N]RVO? -
或许问题是:如果我们在
fun里面打印&b,会不会和pb一样?如果是,为什么?