/ / Perché viene utilizzata una funzione non valida anziché una conversione implicita? - c ++, c ++ 11, ambiguità, risoluzione del sovraccarico, malformato

Perché viene utilizzata una funzione non valida anziché una conversione implicita? - c ++, c ++ 11, ambiguità, risoluzione del sovraccarico, malformato

Questo è il mio frammento di codice:

class Base{};

class Derived : private Base{};

template<class T>
class Wrapper
{
public:
template<typename T2>
Wrapper( T2&& )
{ }
};

// Function declarations
void func( Base& param );
void func( Wrapper<Derived> );
void funcUnambiguous( Wrapper<Derived> );


// Here is the Call:
Derived d = Derived();
func( d );               // <- Error

GCC 4.9 mi dà: error: "Base" is an inaccessible base of "Derived"

Mentre io lo faccio

Derived d = Derived();

funcUnambiguous( d );

funziona perfettamente

Sembra che ogni funzione che richiede un cast a basso costo, anche se malformata, nasconde funzioni implicite ma costose. Qualcuno ha idea?

risposte:

5 per risposta № 1

Aggiornato, grazie a @ T.C.

Wrapper"s ctor è un modello conversione definita dall'utente, quindi il non-modello sequenza di conversione standard sovraccarico con Base& ha la precedenza. Il controllo dell'accesso viene eseguito solo dopo selezionando il sovraccarico - che è troppo tardi nel tuo caso.

Le regole complete sono complicate, altre possono essere trovate Qui, guarda la sezione "La migliore funzione valida".