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終了時には実行されません。