为什么C ++中的方法解引用运算符的指针具有如此低的优先级?

Sha*_*esh 4 c++ language-lawyer

C ++中指向成员解引用运算符(.*->*)的指针的优先级为4,而函数调用运算符的优先级为2。这几乎可以保证需要括号:

#include <iostream>

struct A {
    int b;

    int func1( int a ) { return a+b+1; }
    int func2( int a ) { return 2*a+b; }
};

int main() {
    A a;

    a.b = 3;

    int (A::*ptr)(int);

    ptr = &A::func1;
    std::cout<<
            (a.*ptr) // <- these parenthesis
                ( 2 ) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

在我看来,将.*优先级2 定义为(具有从左到右的关联性)将不需要括号,而不会出现明显的不良副作用。

选择此优先级的原因是什么?

Lig*_*ica 6

我不确定,但请记住以下代码有效:

const double x = 2.*3 + 4; // (2.0 * 3) + 4
Run Code Online (Sandbox Code Playgroud)

使.*优先级不同可能会使令牌化阶段变得不可接受地复杂。

不管是什么原因,从1980年代和CFront 2.0(文档,第22页)开始就采用这种方式。不幸的是,当时没有给出明确的理由,也没有我可以找到的任何其他历史文献

  • 我没有得到这个答案。..令牌的优先级不是由其令牌化确定的,因为它们发生在编译的不同阶段。(令牌化已经在预处理阶段进行了) (3认同)
  • 也许我们将此称为案例研究,以了解某些人将如何投票支持并继续前进?;) (2认同)