Фоновая информация: это было обнаружено в Visual Studio 2008 и снова подтверждено на Visual Studio 2013. g++ закричала над кодом, в то время как Visual молчаливо нарушала конфиденциальное наследование.
Итак, на Visual С++ у нас есть следующий код:
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
}
Почему первый (временный) auto_ptr компилируется? Я вошел в него в отладке, он сделал именно то, что должно было делать с публичным наследованием (вызвать правый конструктор и т.д.)
Удивительно, что, возможно, проблема с реализацией auto_ptr (мы никогда не знаем...), я уменьшил проблему на этом автономном коде:
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
}
Опять же, я ожидал, что код НЕ компилируется, поскольку Derived наследует конфиденциально от Base.
Но когда мы создаем временное, оно работает.
И мы не можем обвинять его в std:: auto_ptr.
Есть ли что-то в стандарте (98 или 11 или 14), которое я пропустил, или это ошибка?