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
这个异常,因为返回值是一个临时对象,一旦函数退出就会被销毁,从而保证返回指针的唯一性。我很好奇这是如何实现的,它在编译器中是特殊情况还是语言规范中是否有其他条款可以利用?
原文由 Praetorian 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,参见 12.8 §34 和 §35:
只是想再补充一点,按值返回应该是这里的默认选择,因为在最坏的情况下,return 语句中的命名值,即在 C++11、C++14 和 C++17 中没有省略被处理作为右值。例如,以下函数使用
-fno-elide-constructors
标志编译在编译时设置了标志,此函数中发生了两次移动(1 和 2),然后在(3)中发生了一次移动。