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

时间:2019-06-13 16:42:09

标签: 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";
}

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

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

2 个答案:

答案 0 :(得分:6)

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

const double x = 2.*3 + 4; // (2.0 * 3) + 4

.*设置为不同的优先级可能会使令牌化阶段变得复杂得令人无法接受。

无论出于何种原因,从1980年代和CFront 2.0(doc,第22页)开始就一直采用这种方式。不幸的是,当时没有给出明确的理由,也没有给出我可以找到的任何其他historical document

答案 1 :(得分:0)

考虑数据成员:

struct A
{
    int X;
    int* pointer;
};

int main()
{
  int A::*ptr_i;
  ptr_i = &A::X;
  a.*ptr_i = 10;  // Not needed

  int T;
  a.pointer = &T;
  *a.pointer = 20; // Not needed

  int* A::*ptr_ip;
  ptr_ip = &A::pointer;
  *(a.*ptr_ip) = 10;  //  NEEDDED

  int V;
  a.*ptr_ip = &V;
  *(a.*ptr_ip) = 20; // Modifies V, NEEDED

  // Goes interesting..
  A* ap = &a;
  ap->*ptr_ip = &V;
 *(ap->*ptr_ip) = 100;
}

我想说这是简化的。如果我们添加更复杂的函数指针,则它变得更加笨拙,因此需要这样的优先级规则。