成员函数语法在 msvc 上有效,但被 gcc 和 clang 拒绝 [duplicate]

Member function syntax works on msvc but rejected by gcc and clang [duplicate]

提问人:Alex 提问时间:5/27/2023 最后编辑:Remy LebeauAlex 更新时间:5/27/2023 访问量:94

问:

我编写了以下程序,该程序被 msvc 接受,但 gcc 和 clang 都拒绝了它。

struct C
{
    void Bar(int);
};
int main()
{
    void (C::*ptr)(int) = &(C::Bar); //compiles with msvc but both gcc and clang rejects this
}  

现场演示

Gcc 说道:

<source>: In function 'int main()':
<source>:7:32: error: invalid use of non-static member function 'void C::Bar(int)'
    7 |     void (C::*ptr)(int) = &(C::Bar); //compiles with msvc but both gcc and clang rejects this
      |                                ^~~
Compiler returned: 1

哪个编译器是正确的?

C++ 成员函数

评论

0赞 WhozCraig 5/27/2023
只是为了踢球,尝试,而不是&C::Bar&(C::Bar)
1赞 NathanOliver 5/27/2023
我不能肯定地说,因为我不知道我脑海中的语法,但适用于所有三个编译器,并且是我在创建成员函数指针时经常看到和使用的形式。void (C::*ptr)(int) = &C::Bar;
0赞 Ted Lyngmo 5/27/2023
所有实现都可以,但我没有看到优先级的差异。我要哭了......void (C::*ptr)(int) = &C::Bar;

答:

4赞 user12002570 5/27/2023 #1

这是一个 msvc 错误。该标准在 expr.unary.op 中明确禁止这样做:

只有当使用显式 & 并且其操作数是未括在括号中的限定 ID 时,才会形成指向成员的指针。

[注 4:也就是说,表达式 &(qualified-id) 将 qualified-id 括在括号中,不构成“指向成员的指针”类型的表达式。qualified-id 也没有,因为没有从非静态成员函数的 qualified-id 到类型“指向成员函数”的隐式转换,就像从函数类型的左值到类型“指向函数的指针”([conv.func]) 一样。 &unqualified-id 也不是指向成员的指针,即使在 unqualified-id 类的范围内也是如此。 — 尾注]

(强调我的)

这意味着程序格式不正确,并且 msvc 在接受代码时是错误的。

这是 msvc 错误:

MSVC 接受涉及成员函数指针的无效程序

评论

3赞 Ted Lyngmo 5/27/2023
啊,不错。我现在可以停止哭泣了!
1赞 user12002570 5/27/2023
@TedLyngmo哈哈,C++永远不会停止惊喜!
2赞 Eljay 5/27/2023
@TedLyngmo • C++中的 C 代表哭泣,以及为什么它是眼泪驱动开发的世界领导者。
2赞 Ted Lyngmo 5/27/2023
❤️ @Eljay 有一天,我会明白我整天在做什么——或者不在做什么——那会有什么乐趣?:-)