std::unique_ptrs を使用して Windows ハンドルを例外セーフな方法で管理しようとしています。
最初に試しました:
struct HandleDeleter
{
void operator()( HANDLE handle )
{
if( handle )
{
FindVolumeClose( handle )
}
}
}
typedef std::unique_ptr< HANDLE, HandleDeleter > unique_vol_handle_t;
後でコードを使用しようとすると、次のようになります。
unique_vol_handle_t volH( FindFirstVolumeW( buffer, MAX_GUID_PATH ) );
Visual Studio 2012RC から次のエラーが表示されます。
1> error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(std::nullptr_t) throw()' : cannot convert parameter 1 from 'HANDLE' to 'std::nullptr_t'
1> with
1> [
1> _Ty=HANDLE,
1> _Dx=VolumeHandleDeleter
1> ]
1> nullptr can only be converted to pointer or handle types
すぐ上の volH 宣言行を参照します。
しばらく検索した後、基本的に次のように述べているブログ記事を見つけました。
typedef HANDLE pointer;
構造体宣言の先頭に追加すると、すべてがうまくいきます。
信じられませんでしたが、試してみたところ、エラーは解決しました。型を (型を参照することさえせずに) 定義することで、どのようにこのような違いが生じるのか、私は困惑しています。
2 つの質問:
1) 元のエラーを説明できますか? コンパイラが を参照している理由がわかりませんstd::nullptr_t/nullptr
。
2) typedef がこれをどのように解決しますか (または少なくともそう思われるか)? これに対する「遠く離れた不気味なアクション」の解決策はありますか?