首页 > 解决方案 > 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级?

问题描述

在 C++ 中,指向成员取消引用运算符 ( .*and ->*) 的指针的运算符优先级为 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 将(具有从左到右的关联性)否定括号的需要,并且没有明显的不良副作用。

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

标签: c++language-lawyer

解决方案


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

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

制作.*具有不同的优先级可能会使标记化阶段变得不可接受地复杂化。

不管是什么原因,自 1980 年代和 CFront 2.0(文档,第 22 页)以来就是这种情况。不幸的是,当时没有给出明确的理由,也没有在我能找到的任何其他历史文件中给出。


推荐阅读