You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

成员函数指针语法在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:34:59