Есть у меня маленький класс Handle, реализующий RAII для виндового типа HANDLE (общий тип для объектов ядра). Сам тип HANDLE определен в винде, как void *. В моем классе, как положено, есть конструктор с параметром типа HANDLE, и метод operator HANDLE.
Все было прекрасно, пока я однажды не написал:
HANDLE Sync = (Timer != 0)? Timer : Event;
где Timer — объект класса Handle, а Event — обычная переменная типа HANDLE.
Я ожидал, что компилятор преобразует Timer к HANDLE, а он, наоборот, преобразует Event к объекту класса Handle, создавая временный объект, и тут же уничтожая его, что приводит к вызову деструктора и закрытию хэндла.
Такая же хрень происходит, если вместо HANDLE использовать int или другой интегральный тип.
Можно ли как-то указать в классе, чтобы в подобных случаях объект преобразовывался к простому типу через соответствующий метод, а не наоборот?