最近看 pointer 相关的type_traits
,赫然发现除了is_pointer
居然还有个is_member_pointer
(更进一步的还有is_member_object_pointer
& is_member_function_pointer
)
我就很奇怪:指向对象成员的指针和普通指针有什么不一样啊? 我以为是这样的:
struct a_class { int i };
int main()
{
a_class aobj;
static_assert(std::is_member_object_pointer<decltype(&aobj.i)>::value, "not right?");
}
看来是我想当然了,那么到底怎样才是 member object pointer 呢?结果是这样的:
static_assert(std::is_member_object_pointer<decltype(&a_class::i)>::value, "this is fine");
&a_class::i
Aha...WTF? 这种指针到底是什么意思,有什么用呢?
欲知详情请参考: https://en.cppreference.com/w/cpp/language/pointer ,这里直接搬运一下里面的示例代码吧:
struct C { int m; };
int main()
{
int C::* p = &C::m; // pointer to data member m of class C
C c = {7};
std::cout << c.*p << '\n'; // prints 7
C* cp = &c;
cp->m = 10;
std::cout << cp->*p << '\n'; // prints 10
}
1
wutiantong OP 总结一下它们的核心区别:
普通 pointer 可以随便 dereference,pointers to members 要需求一个对应类的实例才能 dereference 这有点像 java 里面 static 内部类和 non-static 内部类的区别。 |