
最近看 pointer 相关的type_traits,赫然发现除了is_pointer居然还有个is_member_pointer(更进一步的还有is_member_object_pointer & is_memer_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 内部类的区别。 |