У меня есть следующий класс:
class MyClass {
public:
MyClass( char* what ) : controlled( what ) {}
~MyClass() { delete[] controlled; }
operator char*() const { return controlled; }
operator void*() const { return controlled; }
operator bool() const { return controlled != 0; }
private:
char* controlled;
};
Это скомпилировано с Microsoft SDK, который имеет следующие typedefs:
typedef long LONG_PTR;
typedef LONG_PTR LPARAM;
Телефонный код выполняет следующие действия:
MyClass instance( new char[1000] );
LPARAM castResult = (LPARAM)instance;
// Then we send message intending to pass the address of the buffer inside MyClass
::SendMessage( window, message, wParam, castResult );
Внезапно castResult
is 1
- MyClass::operator bool()
вызывается, он возвращает true
, который преобразуется в 1
. Поэтому вместо передачи адреса я передаю 1
в SendMessage()
, что приводит к неопределенному поведению.
Но почему operator bool()
вызывается в первую очередь?