Следующий код успешно скомпилирован с помощью 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);
~~~~^~~~~~~~~
Проблема в том, что libstdc ++ реализовал std::shared_ptr
, унаследовав функцию-член get
от базового класса std::__shared_ptr
.
В стандарте C ++ 20.8.2.2 Шаблон класса shared_ptr он определяет определение класса std :: shared_ptr со всеми функциями-членами этого класса.
Мой вопрос в том, должна ли реализация по крайней мере предоставлять все члены общедоступного класса, как определено в стандарте, внутри стандартного класса? Разрешено ли предоставлять функции-члены путем наследования от базового класса, реализованного в libstdc ++?
std::shared_ptr<int>::get
является функцией-членомstd::shared_ptr<Int>
независимо от того, как он туда попал, аT
в шаблоне -std::shared_ptr<int>
. - person Pete Becker   schedule 24.06.2016std::exception
позволяет построить его из строки C, которуюexception.what()
вернет; насколько мне известно, ни один из производных от него классов (таких какstd::logic_error
иstd::runtime_error
) даже не отменяетwhat()
, они просто передают строковый параметр своих ctors специфичному для MSexception
ctor, который принимает строку C для установки выводаwhat()
. Важно то, что он предлагает поведение, указанное в стандарте. - person Justin Time - Reinstate Monica   schedule 24.06.2016shared_ptr
есть членget
, могу ли я ожидать правильного поведения при компиляции приведенного выше кода? - person kwanti   schedule 25.06.2016