2

以下代码将引发警告:

警告 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());

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

4

3 回答 3

9

swap成员函数std::unique_ptr采用非常量左值引用,表达式foo()是右值,作为foo返回对象的函数(与引用相反)。您不能将右值绑定到非常量左值引用。

请注意,您可以通过其他方式进行交换:

foo().swap(myVar);

更简单的做法是直接初始化:

std::unique_ptr<T> myVar(foo());
于 2012-08-24T22:54:13.810 回答
1

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

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

foo().swap( myVar );
于 2012-08-24T22:54:48.463 回答
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());
于 2012-08-24T22:55:08.333 回答