8 Expressions [expr]

8.5 Pointer-to-member operators [expr.mptr.oper]

Операторы указателя на член ->* и .* группировка слева направо.

pm-expression:
	cast-expression
	pm-expression .* cast-expression
	pm-expression ->* cast-expression

Бинарный оператор .* связывает свой второй операнд, который должен иметь тип «указатель на член T», со своим первым операндом, который должен быть значением gl класса T или класса, T однозначным и доступным базовым классом. Результатом является объект или функция типа, указанного вторым операндом.

Бинарный оператор ->* связывает свой второй операнд, который должен иметь тип «указатель на член T», со своим первым операндом, который должен иметь тип «указатель на U», где U либо T один из классов, либо класс которого T является однозначным и доступным базовым классом. Выражение E1->*E2 преобразуется в эквивалентную форму (*(E1)).*E2.

Сокращение как , называется . Если динамический тип не содержит члена, на который ссылается, поведение не определено. В противном случае выражение ставится перед выражением .pm-expression.*cast-expression E1.*E2 E1 object expression E1 E2 E1 E2

Ограничения на cv-квалификацию и способ, которым cv-квалификаторы операндов комбинируются для получения cv-квалификаторов результата, такие же, как правила для E1.E2 данных в [expr.ref]. [ Note: Невозможно использовать указатель на член, который ссылается на mutable член, для изменения const объекта класса. Например,

struct S {
  S() : i(0) { }
  mutable int i;
};
void f()
{
  const S cs;
  int S::* pm = &S::i;          // pm refers to mutable member S​::​i
  cs.*pm = 88;                  // ill-formed: cs is a const object
}

end note]

Если результатом .* или ->* является функция, то этот результат можно использовать только как операнд для оператора вызова функции (). [Example:

(ptr_to_obj->*ptr_to_mfct)(10);

вызывает функцию-член, обозначенную ptr_­to_­mfct для объекта, на который указывает ptr_­to_­obj. ] В выражении, объектное выражение которого является rvalue, программа имеет неправильный формат, если второй операнд является указателем на функцию-член с . В выражении, объектное выражение которого является lvalue, программа имеет неправильный формат, если второй операнд является указателем на функцию-член с . Результатом выражения, второй операнд которого является указателем на член данных, является lvalue, если первый операнд - lvalue, и xvalue в противном случае. Результатом выражения, второй операнд которого является указателем на функцию-член, является prvalue. Если второй операнд - это , поведение не определено.end example .* ref-qualifier & .*ref-qualifier && .* .* null member pointer value