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非 const 左辺値参照を取り、式は(参照ではなく) オブジェクトを返す関数のfoo()ように右辺値です。foo右辺値を非 const 左辺値参照にバインドすることはできません。

逆の方法でスワップを実行できることに注意してください。

foo().swap(myVar);

より簡単なことは、単純な初期化です。

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

std::unique_ptr::swapconst他のポインタへの非参照を取ります。右辺値を非 const 参照にバインドすることはできませんが、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 に答える