我用 C++23 编写了以下程序,该程序使用 gcc 和 clang 进行编译,但被 msvc 拒绝。我想知道根据标准哪个编译器在这里是正确的。 现场演示
struct C
{
void f(this C);
void b()
{
(C::f)(); //compiles in gcc and clang but msvc rejects
}
};
int main()
{
C c;
c.b();
}
MSVC 说:
<source>(7): error C2352: 'C::f': a call of a non-static member function requires an object
<source>(3): note: see declaration of 'C::f'
根据标准,哪个编译器是正确的
该程序格式良好。
这个可以从expr.prim.id看出:
如果 id 表达式 E 表示某个类 C 的非静态非类型成员,当前类 ([expr.prim.this]) 是 X 和
- E 可能被评估或 C 是 X 或 X 的基类,并且 E 不是类成员访问表达式 ([expr.ref]) 的 id 表达式,并且
- 如果 E 是限定 ID,则 E 不是一元 & 运算符 ([expr.unary.op]) 的无括号操作数,
使用
(*this)
作为对象表达式,将id 表达式转换为类成员访问表达式。
这意味着
(C::f)()
转换 为 ((*this).f)()
,其格式完全正确,并且被所有三个编译器接受。