11 Declarators [dcl.decl]

11.3 Meaning of declarators [dcl.meaning]

11.3.3 Pointers to members [dcl.mptr]

В декларации, T D где D есть форма

nested-name-specifier * attribute-specifier-seqopt cv-qualifier-seqopt D1

и nested-name-specifier обозначает класс, а тип идентификатора в объявлении T D1 - «derived-declarator-type-list T», тогда тип идентификатора D - « указатель на член класса типа »derived-declarator-type-list cv-qualifier-seqnested-name-specifierT . Необязательный attribute-specifier-seqэлемент принадлежит указателю на член.

[Example:

struct X {
  void f(int);
  int a;
};
struct Y;

int X::* pmi = &X::a;
void (X::* pmf)(int) = &X::f;
double X::* pmd;
char Y::* pmc;

объявляет pmi, pmf, pmd и ,pmc чтобы быть указателем на член X типа int, указатель на член X типа void(int), указатель на член X типа double и указатель на член Y типа char соответственно. Объявление pmd правильно сформировано, даже если X не имеет членов типа double. Точно так же pmc правильно сформировано объявление, даже если Y это неполный тип. pmi и pmf может использоваться так:

X obj;
// ...
obj.*pmi = 7;       // assign 7 to an integer member of obj
(obj.*pmf)(7);      // call a function member of obj with the argument 7

end example]

Указатель на член не должен указывать на static member класс, член со ссылочным типом или «cv void».

[ Note: См. Также [expr.unary] и [expr.mptr.oper]. Тип «указатель на член» отличается от типа «указатель», то есть указатель на член объявляется только синтаксисом указателя на декларатор члена, а не синтаксисом декларатора указателя. В C ++ нет типа «ссылка на член». ]end note