demo:
#include<iostream>
struct A { int i = 10; };
struct B : A { };
int main(){
std::cout << "decltype(&B::i) == int A::* ? " << std::boolalpha
<< std::is_same<decltype(&B::i), int A::*>::value << '\n'; //#1
A a;
std::cout << a.*(&A::i) << '\n';
std::cout << "decltype(&B::i) == int B::* ? "
<< std::is_same<decltype(&B::i), int B::*>::value << '\n'; //#2
B b;
std::cout << b.*(&B::i) << '\n';
}
The code prints
decltype(&B::i) == int A::* ? true
10
decltype(&B::i) == int B::* ? false
10
I used the example in [expr.unary.op]/3, where the standard says that the type of &B::i is int A::*, but that is not normative.