unique_ptr の C++03 エミュレーションがどのように実装されているかを理解しようとしています。unique_ptr は std::auto_ptr に非常に似ていますが、より安全です。auto_ptr が所有権を暗黙的に (つまり、黙って) 譲渡した場合、コンパイラ エラーを吐き出します。たとえば、単純な割り当て。関数move
は、エミュレートされた unique_ptr の安全性の背後にある鍵です。
質問:
- 移動機能が 3 つあるのはなぜですか?
参照を受け取り、それを右辺値に変換する 3 番目の move 関数は、次のように実装 (簡略化) されています。
T move(T &t) { return T(detail_unique_ptr::rv<T>(t)); }
上記のコードでは、T への明示的な変換は不必要に思えます。実際、Visual Studio 2010 は T への明示的な変換がなくても問題ありません。
T move(T &t) {
return detail_unique_ptr::rv<T>(t);
}
ただし、g++、clang、Comeau は 2 番目のバージョンが好きではありません。unique_ptr<T>
これらのコンパイラは、パラメーターとして取るコンストラクターがないと文句を言いdetail_unique_ptr::rv<T>
ます。何故ですか?unique_ptr は、パラメーターとして受け取る (非明示的な) コンストラクターを既に定義してdetail_unique_ptr::rv<T>
います。それが自動的に取得されないのはなぜですか?