std::forward и фабрика, которая вызывает std::make_shared
У меня есть такой код...
X* raw = ::new X("abc");
// do something benign to object
std::shared_ptr<X> ptr(raw);
Теперь рассмотрим то же самое, используя объектную фабрику...
template<typename T, typename... A>
std::shared_ptr<T> factory(A&&... args) {
auto ptr = std::make_shared<T>(std::forward<A>(args)...);
// do something benign to object
return ptr;
}
std::shared_ptr<X> ptr = factory<X>("abc");
Это упрощенный пример, но я вижу необъяснимое падение при использовании фабрики, которое, по-видимому, связано с поврежденным общим указателем.
Я не знаком с внутренностями std::make_shared
, но мне интересно, если он, в свою очередь, делает что-то вроде пересылки аргументов для размещения ::new
и что эта цепная пересылка является проблемой.