demo https://wandbox.org/permlink/p2I9LjqfJCM2Adci:
#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';
}
代码打印出来
decltype(&B::i) == int A::* ? true
10
decltype(&B::i) == int B::* ? false
10
我使用了中的例子[expr.unary.op]/3 http://eel.is/c++draft/expr.unary.op#3,其中标准表示类型&B::i
is int A::*
,但这并不规范。
从您链接到的段落中,强调我的:
如果操作数是命名非静态或变体成员的限定 IDm
某类的C
与类型T
,结果的类型为“指向成员的指针
班级的C
类型的T
” 并且是指定的纯右值C::m
.
“某堂课C
" 表示它不必与限定 ID 提到的类别相同。在这种情况下,i
是的成员A
,并仍然是A
即使被命名为&B::i
。的类型&B::i
因此int A::*
,你可以通过测试来验证
std::is_same<decltype(&B::i), int A::*>::value
根据[等级.质量]/1 https://timsong-cpp.github.io/cppwp/n4659/class.qual#1,成员查找遵循详细的算法[类.成员.查找] https://timsong-cpp.github.io/cppwp/n4659/class.member.lookup。它是根据那里的规则,检查成员所在的子对象i
来自,该类C
决心,决意,决定。自从i
是子对象的成员A
,指向成员的指针的类被确定为A
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)