为什么我不能将unique_ptr与函数返回的unique_ptr交换?

aCu*_*ria 2 c++ unique-ptr visual-studio-2012

以下代码将发出警告:

警告C4239:使用非标准扩展名:'argument':从'std :: unique_ptr <_Ty>'转换为'std :: unique_ptr <_Ty>&'

std::unique_ptr<T> foo() { return std::unique_ptr<T>( new T ); }
std::unique_ptr<T> myVar;
myVar.swap(foo());
Run Code Online (Sandbox Code Playgroud)

我想知道处理这种情况的正确方法是什么.

CB *_*ley 8

所述swap的成员函数std::unique_ptr需要一个非const左值和参考的表达foo()是一个rvalue作为foo是返回一个对象(相对于基准)的功能.您不能将rvalue绑定到非const左值引用.

请注意,您可以反过来进行交换:

foo().swap(myVar);
Run Code Online (Sandbox Code Playgroud)

更简单的事情是直接初始化:

std::unique_ptr<T> myVar(foo());
Run Code Online (Sandbox Code Playgroud)