【发布时间】:2016-04-28 09:34:20
【问题描述】:
我正在尝试了解此程序中引发的错误的一致性:
#include <iostream>
class A{
public:
void test();
int x = 10;
};
void A::test(){
std::cout << x << std::endl; //(1)
std::cout << A::x << std::endl; //(2)
int* p = &x;
//int* q = &A::x; //error: cannot convert 'int A::*' to 'int*' in initialization| //(3)
}
int main(){
const int A::* a = &A::x; //(4)
A b;
b.test();
}
输出为10 10。我标记了程序的 4 点,但 (3) 是我最关心的:
-
x通常从成员函数内部获取。 -
使用范围运算符获取对象的
x,并返回对象x的左值。 - 鉴于
A::x在(2) 中返回了int左值,为什么&A::x不返回int*而是返回int A::*?范围运算符甚至优先于&运算符,因此应首先运行A::x,在获取地址之前返回一个int左值。即这应该与&(A::x)相同吗? (顺便说一句,添加括号确实有效)。 - 当然,这里有点不同,范围运算符引用一个类成员,但没有引用对象。
那么为什么A::x 不返回对象x 的地址,而是返回成员的地址,而忽略:: 在& 之前的优先级?
【问题讨论】:
标签: c++ c++11 pointer-to-member