Подтвердить что ты не робот

Почему литой оператор на частную базу не используется?

В этом коде, назначаемом 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;
}
4b9b3361

Ответ 1

Из [class.conv.fct]:

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

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

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

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