Ваше предложение (вызов конструктора shared_ptr<T>
без аргументов) является правильным. (Вызов конструктора со значением 0 эквивалентен.) Я не думаю, что это будет медленнее, чем вызов vec.push_back()
с ранее существовавшим shared_ptr<T>
, так как конструирование требуется в обоих случаях (прямое построение или копирование -строительство).
Но если вы хотите "более приятный" синтаксис, вы можете попробовать следующий код:
class {
public:
template<typename T>
operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;
Это объявляет один глобальный объект nullPtr
, который включает следующий естественный синтаксис:
shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));
...
pi = nullPtr;
psat = nullPtr;
Обратите внимание, что если вы используете это в нескольких единицах перевода (исходных файлах), вам нужно дать классу имя (например, _shared_null_ptr_type
), переместить определение объекта nullPtr
в отдельный файл .cpp и добавьте объявления extern
в заголовочный файл, где определен класс.