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

MSVC可编译&(Class::mem)语法但GCC不行,谁符合C++标准?

成员指针语法的编译器行为合规性问题

近期学习成员指针语法时编写了一段代码,这段代码可被MSVC编译通过,但GCC和Clang均拒绝编译:

#include <iostream>
#include <type_traits> 
#include <concepts>
struct C
{
    int foo()
    {
        return 5;
    }
};
int main()
{ 
      int (C::*ptr)() = &(C::foo);   // MSVC编译通过,GCC和Clang编译失败
}  

想了解哪种编译器的行为符合C++标准?


GCC和Clang的行为符合C++标准,MSVC的编译通过属于非标准扩展。

根据C++标准规定,获取成员函数指针的正确语法是直接使用&C::foo,不能在C::foo外层额外添加括号。代码中的&(C::foo)不符合标准语法逻辑:C::foo作为成员函数名,单独被括号包裹后并不构成合法的可寻址实体,成员函数指针必须通过&与类限定符直接结合来获取。

MSVC允许这种写法是其提供的非标准语言扩展,而GCC和Clang严格遵循C++标准规范,因此会拒绝编译该代码。

修正后的标准写法如下:

int (C::*ptr)() = &C::foo;

内容的提问来源于stack exchange,提问作者user20562802

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:04:51