Следующий код успешно скомпилирован с clang и MSVC, но не скомпилирован в 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);
}
со следующим сообщением об ошибке
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);
~~~~^~~~~~~~~
Проблема заключается в том, что libstdС++ реализовал std::shared_ptr
путем наследования функции-члена get
из базового класса std::__shared_ptr
.
В стандарте С++ 20.8.2.2 Шаблон класса shared_ptr он определяет определение класса класса std:: shared_ptr со всеми функциями-членами этого класса.
Мой вопрос заключается в том, должна ли реализация, по крайней мере, предоставлять все публичные члены класса, определенные в стандарте внутри стандартного класса? Разрешено ли предоставлять функции-члены путем наследования из базового класса, реализованного в libstdС++?