Informazioni di base: questo è stato rilevato su Visual Studio 2008 e confermato nuovamente su Visual Studio 2013. G ++ ha urlato al codice, mentre Visual ha accettato la violazione dell'ereditarietà privata in modo silenzioso.Perché auto_ptr sembra violare l'ereditarietà privata su Visual C++?
Così, su Visual C++, abbiamo il seguente codice:
class Base {};
class Derived : Base {}; // inherits privately. Adding explicitly the
// keyword private changes nothing
int main()
{
std::auto_ptr<Base>(new Derived) ; // compiles, which is NOT EXPECTED
std::auto_ptr<Base> p(new Derived) ; // Does not compile, which is expected
}
Perché sarebbe la prima (temporanea) auto_ptr compilare? Sono andato all'interno di esso in debug, ha fatto esattamente quello che doveva fare con un'eredità pubblica (chiama il costruttore giusto, ecc.)
Chiedendosi se il problema fosse forse con l'implementazione auto_ptr (non si sa mai ...), ho ridotto la questione su questo codice standalone:
class Base {};
class Derived : Base {};
template <typename T>
class Ptr
{
T * m_p;
public :
Ptr(T * p_p)
: m_p(p_p)
{
}
} ;
int main()
{
Ptr<Base>(new Derived) ; // compiles, which is NOT EXPECTED
Ptr<Base> p(new Derived) ; // Does not compile, which is expected
}
Anche in questo caso, mi aspettavo il codice per non compilare, in quanto derivata eredita privatamente dalla base.
Ma quando creiamo un temporaneo, funziona.
E non possiamo biasimarlo su std :: auto_ptr.
C'è qualcosa nello standard (o 98 o 11 o 14) che ho perso, o si tratta di un bug?
La mia ipotesi è che 'Ptr (nuova derivata);' non fa come sembra. Sembra che crei un tipo temporaneo di 'Ptr ' costruito con un 'nuovo derivato', ma in realtà dichiara una funzione o alcune assurdità. –
nwp
@nwp: questo sarebbe facile da verificare, basta stampare qualcosa dal costruttore e dal distruttore di 'Derived' per verificare se è stato eseguito un codice reale. –
Questo errore è simile al compilatore, ma con 'static_cast': https://connect.microsoft.com/VisualStudio/feedback/details/540343/visual-c-compiler-downcasting-for-private-inheritance-with-static -cast-succeedes – Csq