unique_ptr<T>
不允许复制构造,而是支持 move 语义。然而,我可以从函数返回一个 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
异常,因为返回值是一个临时对象,一旦函数退出就会销毁它,从而保证了返回指针的唯一性。我很好奇这是如何实现的,它是在编译器中特殊处理的,还是在语言规范中有其他的子句可以利用?