Это мой Отрывок:Почему используется некорректная функция вместо неявного преобразования?
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 дает мне: error: 'Base' is an inaccessible base of 'Derived'
В то время как я
Derived d = Derived();
funcUnambiguous(d);
это просто отлично работает.
Кажется, что любая функция, требующая дешевого литья, даже если она искажена, скрывает неявные, но дорогостоящие функции. Кто-нибудь знает?
Даже если уродливые ?! Это не делает особого смысла, особенно в этом случае, когда базовый класс явно делается «частным». –
Я вижу, но разве это не ошибка в стандарте? Нет никакого неявного преобразования, даже явного. Спасибо, в любом случае! –
@JakobRiedle Разрешение перегрузки является одной из самых сложных частей C++ (IMHO). Я даже не осмелился бы думать, что во всех случаях я знаю все правила, что я знаю, что будет «правильным» или даже «лучше» или как все это будет развиваться с течением времени. :) Думаю, нам просто нужно принять это как есть. –