Указатель на преобразование элемента

Я только что нашел следующие абзацы в проекте стандарта C ++ 03, относящиеся к преобразованию указателя в член.

4.11 / 2 Преобразование указателя на член

Значение r типа «указатель на член B типа cv T», где B - тип класса, может быть преобразовано в r-значение типа «указатель на член D из type cv T », где D - производный класс (пункт 10) от B. Если B - недоступный (пункт 11), неоднозначный (10.2) или виртуальный (10.1) базовый класс D, программа, которая требует этого преобразования, плохо сформирована. Результат преобразования относится к тому же члену, что и указатель на член до того, как произошло преобразование, но он относится к члену базового класса, как если бы он был членом производный класс. Результат относится к члену в экземпляре D из B. Поскольку результат имеет тип «указатель на член D типа cv T», его можно разыменовать с помощью объекта D. Результат будет таким же, как если бы указатель на член B был разыменован с помощью подобъекта B объекта D. Значение указателя на нулевой член преобразуется в значение указателя на нулевой член целевого типа.52)

5.2.9 / 9 static_cast

Rvalue типа «указатель на член D типа cv1 T» может быть преобразован в rvalue типа «указатель на член B типа cv2 T», где B - базовый класс (пункт 10 ) of D, если существует допустимое стандартное преобразование из «указателя на член B типа T» в «указатель на член D типа T» (4.11), и cv2 является той же квалификацией cv, что и cv- qualification than, cv1.63) Значение указателя на нулевой член (4. 11) преобразуется в значение указателя нулевого члена целевого типа. Если класс B содержит исходный член или является базовым или производным классом класса, содержащего исходный член, результирующий указатель на член указывает на исходный член. В противном случае результат приведения не определен. [Примечание: хотя класс B требует не содержать исходный член, динамический тип объекта, на который разыменовывается указатель на член, должен содержать исходный член; см. 5.5. ]

Итак, вот мой вопрос. Как сказано в 5.2.9 / 9, указатель на член D может быть преобразован в указатель на член B, если существует допустимое преобразование, описанное в 4.11 / 2. Означает ли это, что если существует член «m» в D, который не унаследован от B, указатель на член «m» не может быть преобразован в тип указателя на член B?

class Base { };
class Derived : public Base 
{
    int a;
};
typedef int Base::* BaseMemPtr;
BaseMemPtr pa = static_cast(&Derived::a); // invalid, as per 5.2.9/9 ?

В примечании к 5.2.9. / 9, в нем также говорится, что, хотя класс B не обязательно должен содержать исходный член, динамический тип объекта, на котором разыменовывается указатель на член, должен содержать исходный член.

Меня смущает формулировка абзаца. Правильный ли приведенный выше код?

Я искал на сайте, и вот ' Аналогичный вопрос С ++ наследование и указатели на функции-члены , ответ которого касается только случая, когда преобразование из указателя в член базового класса в указатель на член производного класса.

14
задан Community 23 May 2017 в 11:54
поделиться