[英]Pointer to member function with different compilers
我观察到当尝试获取成员函数的指针时,不同的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()'
如果我更改此行以通过地址运算符明确请求地址,如下所示:
void (Foo::*func1)(void) = &Foo::bar; // Added an ampersand
它可以在所有经过测试的编译器中正确编译 。
请注意,其他版本可能会有相同的差异,这只是我可以测试的版本。
那么哪一个是对的?
注意:这不是此问题的重复项。 我知道如何解决。 我的问题集中在不同的编译器上,以及它们为什么表现不同。 据我所知,两个变体在语法上都应该正确,但是不同的编译器似乎以不同的方式来处理。
地址运算符(即operator&
)是强制形成成员函数指针的。
由于函数到指针的隐式转换,它对于非成员函数或静态成员函数的指针是可选的 。
可以使用非成员函数或静态成员函数的地址来初始化指向函数的指针。 由于函数到指针的隐式转换,address-of运算符是可选的。
但是, 函数到指针的隐式转换不适用于非静态成员函数。
函数类型T的左值可以隐式转换为指向该函数的prvalue指针。 这不适用于非静态成员函数,因为引用非静态成员函数的左值不存在。
&
必须填写会员地址:
&Foo::bar
与功能相反,它会衰减到功能指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.