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

时间:2012-08-24 22:52:18

标签: c++ visual-studio-2012 unique-ptr

以下代码将发出警告:

警告C4239:使用非标准扩展名:'参数':从'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());

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

3 个答案:

答案 0 :(得分:8)

swap的{​​{1}}成员函数采用非const左值引用,表达式std::unique_ptr是rvalue,因为foo()是返回对象的函数(相反)参考)。您不能将rvalue绑定到非const左值引用。

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

foo

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

foo().swap(myVar);

答案 1 :(得分:1)

std::unique_ptr::swap对另一个指针采用非const引用。您不能将r值绑定到非const引用,尽管VC ++允许通过非标准扩展。因此警告。

要消除警告,请将foo的返回值存储在变量中,然后交换,或者反转交换的顺序。

foo().swap( myVar );

答案 2 :(得分:1)

你正试图换成一个临时的。你可以试试这个:

std::unique_ptr<T> foo() { return std::unique_ptr<T>( new T ); }
std::unique_ptr<T> myVar1;
std::unique_ptr<T> myVar2 = foo();
myVar1.swap(myVar2);

注意这不是std::unique_ptr特有的。出于同样的原因,以下内容是非法的:

void foo(std::string& s) { .... }
std::string bar() { .... }

foo(bar());