unique_ptr<T>
コピーの構築を許可せず、代わりに移動のセマンティクスをサポートします。それでも、unique_ptr<T>
関数からを返し、戻り値を変数に割り当てることができます。
#include <iostream>
#include <memory>
using namespace std;
unique_ptr<int> foo()
{
unique_ptr<int> p( new int(10) );
return p; // 1
//return move( p ); // 2
}
int main()
{
unique_ptr<int> p = foo();
cout << *p << endl;
return 0;
}
上記のコードはコンパイルされ、意図したとおりに機能します。では、この行1
がコピーコンストラクタを呼び出さず、コンパイラエラーが発生するのはなぜですか。2
代わりにlineを使用しなければならなかった場合、それは理にかなっています(lineを使用し2
ても機能しますが、そうする必要はありません)。
私はC ++ 0xがこの例外を許可していることを知っています。unique_ptr
戻り値は関数が終了するとすぐに破棄され、返されるポインターの一意性を保証する一時的なオブジェクトだからです。これがどのように実装されているのか知りたいのですが、コンパイラーで特別なケースになっているのでしょうか、それとも、これが利用する言語仕様に他の節があるのでしょうか?
unique_ptr
ます。問題全体は、1と2が同じことを達成するための2つの異なる方法であることです。
main
関数の終了後に実行されますが、foo
終了時には実行されません。