我发现当我尝试获取指向成员函数的指针时,不同的GCC版本的行为会有所不同。
class Foo {
public:
void bar() { }
};
int main() {
void (Foo::*func1)(void) = Foo::bar; // Error with gcc 4.3.2 and gcc 7.1.0
return 0;
}
以上代码在Windows上使用 gcc 4.9.2 (MinGW), gcc 6.3 和 clang 4.0 进行编译。 但是使用 gcc 4.3.2 和 gcc 7.1.0 (在Linux上)导致以下错误消息:
error: invalid use of non-static member function 'void Foo::bar()'
如果我将此行更改为explcitly请求地址运算符的地址,如下所示:
void (Foo::*func1)(void) = &Foo::bar; // Added an ampersand
它编译所有经过测试的编译器没有错误。
请注意,与其他版本可能存在相同的差异,这只是我可以测试的版本。
哪一个是对的?
注意:这不是this问题的重复。我知道如何解决它。我的问题集中在不同的编译器以及它们为什么表现不同。正如我所知,两个变体应该在语法上是正确的,但不同的编译器似乎以不同的方式处理它。
答案 0 :(得分:4)
运算符地址(即new Locale("ar")
)必须形成指向成员函数的指针。
pointers to non-member function or static member function的可选,因为函数到指针隐式转换。
可以使用非成员函数的地址或静态成员函数初始化指向函数的指针。由于函数到指针隐式转换,address-of运算符是可选的。
但function-to-pointer implicit conversion并不适用于非静态成员函数。
函数类型T的左值可以隐式转换为该函数的prvalue指针。这不适用于非静态成员函数,因为不存在引用非静态成员函数的左值。
顺便说一句:我尝试使用Gcc head version和Clang head version,都无法编译。
答案 1 :(得分:0)
&
需要获取会员地址:
&Foo::bar
与可以衰减到函数指针的函数相反。