¿Está permitido que la implementación de la biblioteca estándar tenga una definición de clase que sea diferente del estándar C ++?

El siguiente código se compiló correctamente con clang y MSVC pero no se compila en GCC 6.1.0.

#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);
}

con el siguiente mensaje de error

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);
            ~~~~^~~~~~~~~

El problema es que libstdc ++ implementadostd::shared_ptr heredando la función miembroget de una clase basestd::__shared_ptr.

En el estándar C ++20.8.2.2 Plantilla de clase shared_ptr, especifica la definición de clase de la clase std :: shared_ptr con todas las funciones miembro de esa clase.

Mi pregunta es si la implementación debe proporcionar al menos todos los miembros de la clase pública como se define en el estándar dentro de la clase estándar. ¿Está permitido proporcionar las funciones miembro heredando de la clase base como se implementa en libstdc ++?

Respuestas a la pregunta(1)

Su respuesta a la pregunta