指向具有不同编译器的成员函数的指针

时间:2017-06-16 09:08:34

标签: c++ gcc language-lawyer member-function-pointers

我发现当我尝试获取指向成员函数的指针时,不同的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问题的重复。我知道如何解决它。我的问题集中在不同的编译器以及它们为什么表现不同。正如我所知,两个变体应该在语法上是正确的,但不同的编译器似乎以不同的方式处理它。

2 个答案:

答案 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 versionClang head version,都无法编译。

答案 1 :(得分:0)

&需要获取会员地址:

&Foo::bar

与可以衰减到函数指针的函数相反。