MSVC 拒绝带有成员函数调用的程序,而 gcc 和 clang 接受

问题描述 投票:0回答:1

我用 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'
c++ language-lawyer member-functions c++23
1个回答
0
投票

根据标准,哪个编译器是正确的

该程序格式良好

这个可以从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)()
,其格式完全正确,并且被所有三个编译器接受

© www.soinside.com 2019 - 2024. All rights reserved.