2016-03-21 7 views
11

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

Я не могу реплицировать ошибку компиляции, которую вы описываете. – Peter

+0

@Peter: реплицировано [здесь] (http://ideone.com/hKSEAo) –

+0

@Barabas: Я подожду кого-нибудь, у кого есть соответствующая цитата из стандарта, чтобы дать ответ, но подумайте о публичном наследовании как «is- a "и частное наследство как" has-a ". I.e., 'D2' и' D3' являются специальными экземплярами 'B', тогда как' D1' - это собственная вещь, которая имеет * имеет * a 'B'. –

ответ

11

От [class.conv.fct]:

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

Таким образом, в первом примере:

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

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

+0

Итак, если я правильно понимаю, это невозможно наследовать, имея явное преобразование, но не подразумеваемое, не так ли? – Barabas

+0

@ Барабас Не уверен, что вы просите. – Barry

+0

Либо вы наследуете публично, и ваш класс будет неявно преобразовывать его в свою базу, либо вы наследуете конфиденциально (или защищаетесь), и он не будет конвертировать вообще, даже с помощью static_cast/constructor. Это не так, не так ли? – Barabas