P0149R1: Generalised member pointers

一个有趣的语言提案,简单来说就是允许数据成员指针指向成员的成员。给定一段代码:

struct Foo { int a; };
struct Bar { Foo x; int y; };


如果我们要构造一个类型为 int Bar::* 的数据成员指针,目前只能得到一个指向 Bar::y 成员的指针。这篇提案说我们不妨扩展一下数据成员指针的能力让一个 int Bar::* 也可以指向 Bar::x::a 。具体的做法是让数据成员指针能参与获取成员运算,即可以作为点操作符、-> 操作符和 [] 操作符的左操作数,例如:

Foo Bar::*p1 = &Bar::x;
int Bar::*p2 = p1.a;  // <--


由于非虚基类也可以看作是子类中的一个成员,因此本提案还额外支持这样的类型转换:

struct A {};
struct B : A {};
struct C { B b; };

A C::*ptr = &C::b;  // B C::* to A C::* conversion


https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p0149r1.pdf
 
 
Back to Top