멤버함수포인터의 경우엔 함수이름 앞에 반드시 &를 붙여주는 것이 문법이다 말이지요.

그런데 ON_COMMAND 를 예로 들어보면 말이죠 횽님들,

VS6.0 에선 다음의 코드로 구성되어 있어요.

#define ON_COMMAND(id, memberFxn) \\
        { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn },
                // ON_COMMAND(id, OnFoo) is the same as
                //   ON_CONTROL(0, id, OnFoo) or ON_BN_CLICKED(0, id, OnFoo)

분명히 memberFxn 앞에 &연산자가 붙어있어서 주소값을 전달하고 있죵... 아주 바람직한 현상...


허나, 2008로 넘어갈경우..

#define ON_COMMAND(id, memberFxn) \\
        { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, \\
                static_cast<AFX_PMSG> (memberFxn) },
                // ON_COMMAND(id, OnBar) is the same as
                //   ON_CONTROL(0, id, OnBar) or ON_BN_CLICKED(0, id, OnBar)

오오미... memberFxn 앞에 &연산자가 없네용, 그런데도 불구하고 다음의 두 코드는 모두 정상 컴파일...
        
1. ON_COMMAND(ID_APP_ABOUT, CSingleApp::OnAppAbout)
2. ON_COMMAND(ID_APP_ABOUT, &CSingleApp::OnAppAbout)

이유가 무엇일까, 하여 설마 static_cast 때문에 그런가하여, 예제를 구성해서 확인했으나
static_cast와 무관하게 &는 붙여줘야 하더군요.

왜 &를 붙여도되고, 안붙여도 되는 상황이 2008 버젼에선 생기는지 아시는분?

#######내용추가#########
해당 멤버함수포인터의 정의는 다음과 같슴다(AFX_PMSG)
typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);