为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
Why does the pointer to method dereference operator in C++ have such low priority?
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(从左到右的关联性(会否定括号的需要,没有明显的不良副作用。
选择此优先级的原因是什么?
我不确定,但请记住以下代码是有效的:
const double x = 2.*3 + 4; // (2.0 * 3) + 4
使.*
具有不同的优先级可能会使标记化阶段变得不可接受的复杂化。
不管是什么原因,自 1980 年代和 CFront 2.0(文档,第 22 页(以来一直如此。不幸的是,当时没有给出明确的理由,也没有在我能找到的任何其他历史文献中给出。
考虑数据成员:
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;
}
我会说这是简化的。如果我们添加更复杂的函数指针,那么它就会变得更加笨拙,因此需要这样的优先规则。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- C++ 带有函数指针的运算符优先级
- 在一个指令中声明更多指针的运算符优先级
- 带有 cout 和指针的运算符优先级
- 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
- 优先级队列实现为单一链接,无法更新插入的指针转换
- 指针C++的优先级队列
- 通过指针递增成员 int 时,++ 与 -> 的运算符优先级如何工作?
- 模板化优先级队列导致对象成为指针.C++
- 以C++和运算符优先级键入指向数组成员的强制转换指针
- c++中相同指针的两个优先级队列
- 是否有一条规则或优先级可以选择值/指针/引用
- 自定义类指针的优先级队列断言错误
- 带有指针和比较器的优先级队列
- STL优先级队列和指针重载
- 优先级队列排序指针指向改变值的对象.c++
- 带有指向对象指针的优先级队列不能正常工作
- c++对象指针的优先级队列在运行时错误为无效堆