Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向具有不同编译器的成员函数的指针_C++_Gcc_Language Lawyer_Member Function Pointers - Fatal编程技术网

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

C++ 指向具有不同编译器的成员函数的指针,c++,gcc,language-lawyer,member-function-pointers,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上使用GCC4.9.2(MinGW)、GCC6.3和Clang4.0进行编译。 但是,在GCC4

我注意到,当我尝试获取指向成员函数的指针时,不同的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上使用GCC4.9.2(MinGW)、GCC6.3Clang4.0进行编译。 但是,在GCC4.3.2GCC7.1.0(在linux上)中会出现以下错误消息:

如果我将此行更改为通过地址运算符明确请求地址,如下所示:

void (Foo::*func1)(void) = &Foo::bar; // Added an ampersand
它使用所有经过测试的编译器编译,没有错误

请注意,可能与其他版本有相同的差异,这是我唯一可以测试的版本

那么哪一个是正确的呢


注意:这不是问题的重复。我知道怎么修。我的问题集中在不同的编译器上,以及为什么它们的行为不同。据我所知,这两个变体在语法上应该是正确的,但不同的编译器似乎以不同的方式处理它。

&
需要获取成员的地址:

&Foo::bar

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

&
需要获取成员的地址:

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;
}
&Foo::bar
与可衰减为函数指针的函数相反。

运算符的地址(即
运算符&
)是构成成员函数指针的必需地址

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;
}
由于函数到指针的隐式转换,它对于是可选的

指向函数的指针可以用非成员函数或静态成员函数的地址初始化。由于函数到指针的隐式转换,运算符的地址是可选的

但不适用于非静态成员函数

函数类型T的左值可以隐式转换为指向该函数的prvalue指针。这不适用于非静态成员函数,因为引用非静态成员函数的左值不存在

顺便说一句:我尝试了和,但都未能编译。

运算符的地址(即
运算符&
)是指向成员函数的指针所必需的

由于函数到指针的隐式转换,它对于是可选的

指向函数的指针可以用非成员函数或静态成员函数的地址初始化。由于函数到指针的隐式转换,运算符的地址是可选的

但不适用于非静态成员函数

函数类型T的左值可以隐式转换为指向该函数的prvalue指针。这不适用于非静态成员函数,因为引用非静态成员函数的左值不存在



顺便说一句:我尝试了和,两个都未能编译。

可能重复使用指向非静态成员函数的指针所做的操作?在没有
Foo
实例的情况下,如何通过指针调用该函数?@JimmyB我不使用它,因为这只是一个最小的、完整的、可验证的示例。我意识到,在编写Qt代码时,您可以使用指向非静态成员函数的指针创建连接。但是如果我想,我可以像
Foo-Foo;(foo.*func1)()Foo
实例的情况下,如何通过指针调用该函数?@JimmyB我不使用它,因为这只是一个最小的、完整的、可验证的示例。我意识到,在编写Qt代码时,您可以使用指向非静态成员函数的指针创建连接。但是如果我想,我可以像
Foo-Foo;(foo.*func1)()