以下代码将发出警告:
警告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());
我想知道处理这种情况的正确方法是什么。
答案 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());