Let us suppose to have the following code:
struct Foo {
int _data;
};
struct Bar : public Foo {
int* bar() {
return &Foo::_data; // <--- Compiler ERROR!
}
};
The expression &Foo::_data
is evaluated as int Foo::*
(i.e., int
-pointer to a member of the class Foo
). Therefore, the return statement generates a compiler error because there is no implicit cast conversion.
Of course, it is easy to fix this: return &(Foo::_data);
.
Indeed, my intent is to return a pointer to the variable _data
.
In accordance with the C++ precedence operator table, the operator::
should have higher precedence than operator&
.
My question is: why without parenthesization it seems operator&
to have higher precedence?
Note: The compiler error seems to be consistent across different compilers and versions. So I am probably missing something :)
Note: I am not interested in how to fix the problem (I have already proposed a solution in the question, or just using _data
). I more interested to understand why my assumption is not true.