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进行这种例外处理,因为返回值是一个临时对象,它将在函数退出时被销毁,从而保证了返回指针的唯一性。我对这是如何实现的很好奇,它是在编译器中特殊处理的,还是利用了语言规范中的其他条款?
unique_ptr
的所有权。整个问题是关于1和2是实现相同目标的两种不同方式。 - Praetorianmain
函数退出后进行一次,而不是在foo
退出时进行。 - ampawd