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
相关产品推荐
相关产品推荐

