背景情報: これは Visual Studio 2008 で検出され、Visual Studio 2013 で再度確認されました。G++ はコードで叫びましたが、Visual はプライベート継承違反を黙って受け入れました。
したがって、Visual C++ では、次のコードがあります。
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) に見逃しているものはありますか、それともバグですか?