В VC2012 я хочу создать мьютекс в конструкторе с использованием уникального указателя и deleter, так что мне не нужно создавать деструктор только для вызова CloseHandle.
Я бы подумал, что это сработает:
struct foo
{
std::unique_ptr<HANDLE, BOOL(*)(HANDLE)> m_mutex;
foo() : m_mutex(CreateMutex(NULL, FALSE, NULL), CloseHandle) {}
}
но при компиляции я получаю сообщение об ошибке:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,int
(__cdecl *const &)(HANDLE)) throw()' : cannot convert parameter 1 from
'HANDLE' to 'void *'
Когда я изменяю конструктор таким образом:
foo() : m_mutex((void*)CreateMutex(NULL, FALSE,
(name + " buffer mutex").c_str()), CloseHandle) {}
Я получаю еще более необычное:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,
int (__cdecl *const &)(HANDLE)) throw()' : cannot convert
parameter 1 from 'void *' to 'void *'
Сейчас я в недоумении. HANDLE - это typedef for void *: есть ли какая-нибудь магия преобразования, о которой мне нужно знать?