C++ 指向具有不同编译器的成员函数的指针
我注意到,当我尝试获取指向成员函数的指针时,不同的GCC版本的行为不同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
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.3.2和GCC7.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)()我不知道你可以这样做。谢谢:)@JimmyB不客气。不久前,我自己学会了:-)可能重复使用指向非静态成员函数的指针做什么?在没有Foo
实例的情况下,如何通过指针调用该函数?@JimmyB我不使用它,因为这只是一个最小的、完整的、可验证的示例。我意识到,在编写Qt代码时,您可以使用指向非静态成员函数的指针创建连接。但是如果我想,我可以像Foo-Foo;(foo.*func1)()我不知道你可以这样做。谢谢:)@JimmyB不客气。不久前我自己学会了:-)那么GCC4.9.2、GCC6.3和Clang4.0是错的?顺便说一句,我一直印象深刻,如果人们能够引用的标准,那么快,伟大@是的。我用Gcc和clanghead版本进行了尝试,都没有编译成功。我在wandbox上尝试了gcc4.9.2和gcc6.3.0,它们也都失败了。这有点令人惊讶。可能是编译器标志导致了问题?@exilit我不确定;我想这是更新版本中修复的错误。你可能是对的。有趣的是,我的本地MinGW gcc 4.9.2似乎是错误的(副本),而Wandbox上的gcc 4.9.2似乎已经修复(失败),所以gcc 4.9.2、gcc 6.3和clang 4.0是错误的?顺便说一句,我一直印象深刻,如果人们能够引用的标准,那么快,伟大@是的。我用Gcc和clanghead版本进行了尝试,都没有编译成功。我在wandbox上尝试了gcc4.9.2和gcc6.3.0,它们也都失败了。这有点令人惊讶。可能是编译器标志导致了问题?@exilit我不确定;我想这是更新版本中修复的错误。你可能是对的。有趣的是,我的本地MinGW gcc 4.9.2似乎是错误的(副本),而Wandbox上的gcc 4.9.2似乎已经修复(失败)