【发布时间】:2011-05-18 00:48:36
【问题描述】:
unique_ptr<T> 不允许复制构造,而是支持移动语义。但是,我可以从函数返回 unique_ptr<T> 并将返回的值分配给变量。
#include <iostream>
#include <memory>
using namespace std;
unique_ptr<int> foo()
{
unique_ptr<int> p( new int(10) );
return p; // 1
//return move( p ); // 2
}
int main()
{
unique_ptr<int> p = foo();
cout << *p << endl;
return 0;
}
上面的代码按预期编译和工作。那么1 行是如何不调用复制构造函数并导致编译器错误的呢?如果我不得不改用2 行,那将是有意义的(使用2 行也可以,但我们不需要这样做)。
我知道 C++0x 允许 unique_ptr 出现这个异常,因为返回值是一个临时对象,一旦函数退出就会被销毁,从而保证返回指针的唯一性。我很好奇这是如何实现的,是编译器中的特殊情况还是语言规范中的其他子句可以利用?
【问题讨论】:
-
假设,如果你正在实现一个 factory 方法,你希望 1 还是 2 来返回工厂的输出?我认为这将是 1 最常见的用法,因为通过适当的工厂,您实际上希望将构造事物的所有权传递给调用者。
-
@Xharlie ?他们都传递了
unique_ptr的所有权。整个问题是关于 1 和 2 是实现同一目标的两种不同方式。 -
在这种情况下,RVO 也发生在 c++0x 中,unique_ptr 对象的销毁将在
main函数退出后执行一次,但不会在foo时执行退出。
标签: c++ c++11 unique-ptr