Вчера я и мой коллега не были уверены, почему язык запрещает это преобразование
struct A { int x; };
struct B : virtual A { };
int A::*p = &A::x;
int B::*pb = p;
Даже литой помогает. Почему стандарт не поддерживает преобразование указателя базового элемента в производный указатель элемента, если указатель базового элемента является виртуальным базовым классом?
Соответствующая стандартная ссылка на С++:
Значение praleue типа "указатель на член
B
типа cvT
", гдеB
- тип класса, может быть преобразован в prvalue типа "указатель на членD
типа cvT
", гдеD
- производный класс (раздел 10)B
. ЕслиB
является недоступным (клаузулом 11), двусмысленным (10.2) или виртуальным (10.1) базовым классомD
или базовым классом виртуального базового классаD
, программа, требующая этого преобразования, плохо сформирован.
На них влияют как указатели на элементы данных, так и данные.