Почему оператор приведения в частную базу не привыкнет?

В этом коде назначение b1 работает, но не позволяет назначать b2 (со статическим приведением или без него). На самом деле я пытался решить противоположную проблему, публичное наследование, но не косвенным образом преобразовать в базу. Однако оператор приведения никогда не используется. Почему это?

struct B {};

struct D1 : private B {
operator B&() {return *this;}
B& getB() {return *this;}
};

struct D2 : public B {
explicit operator B&() {return *this;}
};

struct D3 : public B {
operator B&() = delete;
};

void funB(B& b){}

int main () {
D1 d1;
funB(d1.getB()); // works
// funB(d1); // fails to compile with 'inaccessible base class
D2 d2;
funB(d2); // works
D3 d3;
funB(d3); // works
return 0;
}

11

Решение

От [Class.conv.fct]:

Функция преобразования никогда не используется для преобразования (возможно, cv-квалифицированного) объекта
на (возможно, cv-квалифицированный) тот же тип объекта (или ссылку на него), в (возможно, cv-квалифицированный) базовый класс этого типа (или ссылку на него), или (возможно, cv-квалифицированный) void.

Итак, в вашем первом примере:

struct D1 : private B {
operator B&() {return *this;}
B& getB() {return *this;}
};

operator B& никогда не будет использоваться, потому что он преобразуется в базовый класс. Неважно, что это частный базовый класс.

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]