unique_ptr<T>
コピーの作成は許可されませんが、代わりに移動セマンティクスをサポートします。それでも、unique_ptr<T>
関数からaを返し、戻り値を変数に割り当てることができます。
#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
がコピーコンストラクターを呼び出さず、コンパイラーエラーが発生するのはどうしてですか?代わりにlineを使用する必要がある場合は、2
それは理にかなっています( lineを使用する2
こともできますが、必須ではありません)。
unique_ptr
戻り値は関数が終了するとすぐに破棄される一時オブジェクトであり、返されたポインターの一意性が保証されるため、C++0xではこの例外が許可されていることを私は知っています。これがどのように実装されているのか知りたいのですが、コンパイラで特別な場合がありますか、それとも言語仕様にこれが悪用する他の句がありますか?