提问人:Alex 提问时间:5/27/2023 最后编辑:Remy LebeauAlex 更新时间:5/27/2023 访问量:94
成员函数语法在 msvc 上有效,但被 gcc 和 clang 拒绝 [duplicate]
Member function syntax works on msvc but rejected by gcc and clang [duplicate]
问:
我编写了以下程序,该程序被 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
哪个编译器是正确的?
答:
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 错误:
评论
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 有一天,我会明白我整天在做什么——或者不在做什么——那会有什么乐趣?:-)
评论
&C::Bar
&(C::Bar)
void (C::*ptr)(int) = &C::Bar;
void (C::*ptr)(int) = &C::Bar;