В этом коде, назначаемом 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;
}
Я не могу реплицировать ошибку компиляции, которую вы описываете. – Peter
@Peter: реплицировано [здесь] (http://ideone.com/hKSEAo) –
@Barabas: Я подожду кого-нибудь, у кого есть соответствующая цитата из стандарта, чтобы дать ответ, но подумайте о публичном наследовании как «is- a "и частное наследство как" has-a ". I.e., 'D2' и' D3' являются специальными экземплярами 'B', тогда как' D1' - это собственная вещь, которая имеет * имеет * a 'B'. –