这是一个关于对象销毁与返回值优化的C++规范的问题。
在std::unique_ptr<>清理之前,我能期望RVO返回正确的值吗?
Foo
Bar()
{
std::unique_ptr<Foo> ptr = new Foo;
return *ptr;
}发布于 2012-12-08 15:05:28
无论是否使用RVO,它都将返回正确的值(本例中没有RVO )。该函数返回一个具体的Foo,因此在销毁指针之前,*ptr将被复制到返回值中。
也就是说,
Foo foo;
foo = Bar();类似于(更明确地解开unique_ptr )
Foo foo;
Foo* ptr = new Foo;
foo = *ptr;
finally:
delete ptr;发布于 2012-12-08 15:21:32
当函数返回类类型对象时,仅在两种情况下允许RVO:
这样你的代码就不会触发RVO。
如果使用自动存储来声明Foo对象,则允许编译器执行RVO:
Foo bar()
{
Foo foo;
return foo; // foo can be constructed directly as the returned object
}如果出于某种原因,您必须使用new创建对象,并且希望消除复制操作,则可以使用std::move,它会将表达式更改为右值:
Foo bar()
{
std::unique_ptr<Foo> ptr(new Foo);
return std::move(*ptr); // No deep copy if Foo implements
// its own move constructor
}https://stackoverflow.com/questions/13775315
复制相似问题