Операторы указателя на член ->* и .* группировка слева направо.
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