成员函数指针语法在MSVC通过却被GCC、Clang拒绝,哪个编译器合规?
MSVC与GCC/Clang对成员函数地址语法的处理差异
结论
GCC和Clang的编译行为符合C++标准,MSVC是启用了非标准的语法扩展。
问题根源
你代码里的这行写法不符合C++标准:
void (C::*ptr)(int) = &(C::Bar);
C++标准规定,取非静态成员函数的地址时,必须直接写成&C::Bar,不能给C::Bar额外加括号。因为C::Bar作为非静态成员函数名,本身不能单独构成一个合法的表达式,(C::Bar)这种包裹方式是非法的,取地址操作符&只能直接作用于类名::成员函数名这个限定名。
修正后的标准代码
符合C++标准、能被所有主流编译器编译通过的写法如下:
struct C { void Bar(int); }; int main() { void (C::*ptr)(int) = &C::Bar; }
MSVC允许&(C::Bar)是它提供的非标准兼容扩展,但这种写法不具备跨编译器可移植性,也不符合C++标准的要求。
内容的提问来源于stack exchange,提问作者user19946454
相关产品推荐
相关产品推荐

