Ist es für die Implementierung einer Standardbibliothek zulässig, dass die Klassendefinition vom C ++ - Standard abweicht?

Der folgende Code wurde erfolgreich mit clang und MSVC kompiliert, kann jedoch in GCC 6.1.0 nicht kompiliert werden.

#include <memory>

template<typename R, typename T, typename... Args>
T* test(R(T::*)(Args...) const)
{
    return nullptr;
}

int main()
{
    using T = std::shared_ptr<int>;
    T* p = test(&T::get);
}

mit der folgenden Fehlermeldung

prog.cc: In function 'int main()':
prog.cc:13:16: error: invalid conversion from 'std::__shared_ptr<int, (__gnu_cxx::_Lock_policy)2u>*' to 'T* {aka std::shared_ptr<int>*}' [-fpermissive]
     T* p = test(&T::get);
            ~~~~^~~~~~~~~

Das Problem ist, dass libstdc ++ implementiert iststd::shared_ptr durch Erben der Mitgliedsfunktionget von einer Basisklassestd::__shared_ptr.

Im C ++ Standard 20.8.2.2 Klassenvorlage shared_ptr gibt die Klassendefinition der Klasse std :: shared_ptr mit allen Memberfunktionen dieser Klasse an.

Meine Frage ist, ob die Implementierung mindestens alle im Standard definierten öffentlichen Klassenmitglieder innerhalb der Standardklasse bereitstellen muss. Dürfen die Memberfunktionen durch Erben von der Basisklasse bereitgestellt werden, wie in libstdc ++ implementiert?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage