Я хотел бы отметить, что принятый ответ потенциально опасен - он делает то, что обещает, но может дорого вам обойтись - безобидным это не так.
Таким образом, вы всегда пересылка экземпляра того, что вы хотите создать, в конструктор копирования.Это ухудшает производительность, но, возможно, что еще более важно, это может даже укусить вас в спину.
В случае, если переданный объект содержит любые ресурсы, уже инициализированные (на месте, даже) как поля, идеструктор освобождает их, затем shared_ptrs, таким образом, всегда указывает на объект с нет фактическими ресурсами.
Пример
Обратите внимание на это надуманное (немного RAII в неведении, но мыполучить к этому) пример:
#include <memory>
#include <iostream>
using namespace std;
template<
typename T,
typename Decayed = typename std::decay<T>::type
>std::shared_ptr<Decayed> deduce_shared(T&& t){
static_assert(!std::is_array<typename std::remove_reference<T>::type>::value, "Array parameters are not allowed.");
return std::make_shared<Decayed>(std::forward<T>(t));
}
class Container{
public:
int* pricyResource = reinterpret_cast<int*>(0xBAADDEAD);
Container(int* pricyResource):pricyResource(pricyResource){
cout << "Constructing, with nice resource:" << *pricyResource << endl;
}
Container(const Container&){
cout << "Copy constructing." << endl;
}
~Container(){
cout << "Destructing." << endl;
delete pricyResource;
}
};
int* acquireResource(){
return new int(9001);
}
int main(){
auto shared = deduce_shared(Container(acquireResource()));
cerr << shared->pricyResource << endl;
cerr << "Destruction / potential segfault (this case) after scope ends." << endl;
return 0;
}
Один потенциальный выход: (Вы не гарантированы, что SIGSEGV.)
Constructing, with nice resource:9001
Copy constructing.
Destructing.
0xbaaddead
Destruction / potential segfault (this case) after scope ends.
Destructing.
Segmentation fault
... это такое большое дело?
Конечно, если ресурс будет помещен в shared_ptr, все будет лучше, но ненамного.Вы также можете утверждать, что ресурс не должен инициализироваться вне класса, но я уверен, что вы можете подумать о ситуации, когда это не имеет особого смысла.
Предполагая, что он защищен shared_ptr, подумайте, что произойдет, еслиесть пул ресурсов пользователей, а ресурс поддерживается живым с помощью shared_ptrs участников?Что ж, в случае, если нет членов (нет запросов клиентов, нет записей в очереди сообщений и т. Д.), И один элемент появляется в пуле, дорогой ресурс мигает и исчезает - конструктор первого члена создаетресурс, затем его деструктор немедленно удаляет его.Если его конструктор копирования ожидает, что ресурс будет там, или не хочет этого делать, и фактически проверяет, существует ли он, и замечает, что он не существует, ресурс создается / подключается / снова выделяется.
(Можно утверждать, что где-то должен быть уникальный указатель и выделенный «владелец» этого ресурса, и вы правы - но давайте предположим иначе.)
Заключение
В общем, не делайте этого - просто нет причин для этого.Используйте make_shared<Type(constructor,arguments,of,the,type).
Мелкий шрифт : конечно, вы можете положиться на конструктор по умолчанию, который ничего не делает (или переключает флаги), и деструктор, реализующий такое пустое состояние, но при этомсомнительный дизайн.
Чрезвычайно мелкий шрифт : Мне известна политика SO в отношении ответов на ответы с ответами, но у меня просто недостаточно представителя, чтобы комментировать или редактировать этот ответ,и думал, что я мог бы спасти некоторых людей некоторое время.Я также понимаю, что другие люди возражали против использования намерения ОП, но не видели ничего против этого конкретного фрагмента.