The code in question is valid, sort of. It compiles due to a combination of two things:
dc.SelectObject(font), . (operator HFONT()), HFONT. HGDIOBJ ( HGDIOBJ HFONT typedef'd void*).
, , , :
. , :
CFont* pOldFont = (CFont*) dc.SelectObject(font);
, undefined. dc.SelectObject(font) HGDIOBJ (typedef'd as void*), (CFont*). , , , . , , :
CPaintDC dc(this);
CFont font;
CFont oldFont;
oldFont.Attach(dc.SelectObject(font.Detach()));
font.Attach(dc.SelectObject(oldFont.Detach()));
, , :
CPaintDC dc(this);
CFont font;
CFont* pOldFont = dc.SelectObject(&font);
dc.SelectObject(pOldFont);
, , . , CFont ( API). , , : , , MFC, (, , CGdiObject::FromHandle, SelectObject(CFont*)). MFC.