这是关于对象破坏与返回值优化的C ++规范的问题。
我可以期待RVO在std :: unique_ptr<>之前返回正确的值吗?清理?
Foo
Bar()
{
std::unique_ptr<Foo> ptr = new Foo;
return *ptr;
}
答案 0 :(得分:5)
无论是否有RVO,它都会返回正确的值(在这种情况下没有RVO)。该函数返回一个具体的Foo
,因此*ptr
将被复制到销毁指针之前的返回值。
这意味着,
Foo foo;
foo = Bar();
类似于(展开unique_ptr以使其更明确)
Foo foo;
Foo* ptr = new Foo;
foo = *ptr;
finally:
delete ptr;
答案 1 :(得分:1)
当函数返回类类型对象时,仅允许两种情况下使用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
}