7 Standard conversions [conv]

7.12 Pointer to member conversions [conv.mem]

A null pointer constant можно преобразовать в указатель на тип члена; результат является null member pointer value элементом этого типа, и его можно отличить от любого указателя на член, не созданного из константы нулевого указателя. Такое преобразование называется файлом null member pointer conversion. Два значения указателя нулевого члена одного и того же типа должны сравниваться как равные. Преобразование константы нулевого указателя в указатель на член типа с квалификацией cv является одним преобразованием, а не последовательностью преобразования указателя в член, за которым следует qualification conversion.

Prvalue типа «указатель на член B типа cv T», где B является типом класса, может быть преобразовано в prvalue типа «указатель на член D типа cv T», где D - derived class из B. Если B это inaccessible, ambiguousили virtual базовый класс D, или базовый класс виртуального базового класса D, программа , которая делает необходимую это преобразование плохо сформировано. Результат преобразования относится к тому же члену, что и указатель на член до того, как произошло преобразование, но он относится к члену базового класса, как если бы он был членом производного класса. Результат относится к члену в Dэкземпляре B. Поскольку результат имеет тип «указатель на член D типа cv T», косвенное обращение к нему с D объектом допустимо. Результат такой же, как при косвенном указателе на член B с B подобъектом D. Значение указателя нулевого члена преобразуется в значение указателя нулевого члена целевого типа.61

Правило преобразования указателей в члены (из указателя на член базы в указатель на член производного) кажется инвертированным по сравнению с правилом для указателей на объекты (из указателя в производный в указатель на базу) ([conv.ptr], Предложение [class.derived]). Эта инверсия необходима для обеспечения безопасности типа. Обратите внимание, что указатель на член не является указателем объекта или указателем функции, и правила преобразования таких указателей не применяются к указателям на члены. В частности, указатель на член не может быть преобразован в void*.