以下代码将引发警告:
警告 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());
我想知道处理这种情况的正确方法是什么。
以下代码将引发警告:
警告 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());
我想知道处理这种情况的正确方法是什么。
的swap
成员函数std::unique_ptr
采用非常量左值引用,表达式foo()
是右值,作为foo
返回对象的函数(与引用相反)。您不能将右值绑定到非常量左值引用。
请注意,您可以通过其他方式进行交换:
foo().swap(myVar);
更简单的做法是直接初始化:
std::unique_ptr<T> myVar(foo());
std::unique_ptr::swap
对另一个指针进行非const
引用。您不能将 r 值绑定到非常量引用,尽管 VC++ 通过非标准扩展允许这样做。因此发出警告。
要消除警告,请将 的返回值存储foo
在变量中然后交换,或者颠倒交换的顺序。
foo().swap( myVar );
你正试图换成临时的。你可以试试这个:
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());