Что является лучшим способом, чтобы возвратить новый экземпляр толчок intrusive_ptr


В отличие от большинства(?) смарт-указатели, тип Boost::intrusive_ptr имеет неявный конструктор. Учитывая, что, можно было бы написать

typedef boost::intrusive_ptr<Foo> FooPtr;

FooPtr MyFactory()
{
    return new Foo(a, b, c);
}

Или можно было бы написать

FooPtr MyFactory()
{
    return FooPtr(new Foo(a, b, c));
}

Последнее согласуется с тем, как код должен быть написан, если FooPtr были другого рода смарт-указатель, как shared_ptr или unique_ptr не. Бывший является более кратким. Я лично предпочитаю лаконичные пока это не приведет к неприятностям для читателей и сопровождающих позже. Мне интересно, будет ли в первом случае-это "слишком" сжато?



297
2
c++
задан 10 августа 2011 в 02:08 Источник Поделиться
Комментарии
1 ответ

Когда в сомнении, быть явными. В то время как обе функции будет работать, вторая выражает намерения программиста более четко. Добавление комментария вдоль линий "это вызывает неявный конструктор intrusive_ptr" на Первом могут помочь, хотя на тот момент это более кратким, чтобы вызвать конструктор напрямую. Возвращает исходный указатель и полагаясь на неявный конструктор для intrusive_ptr можно также рассматривать как ошибку, введенные изменения декларации MyFactory() , но забыл его определение. Опираясь на неявные конструкторы также может сделать код сложнее отлаживать и поддерживать, потому что по умолчанию конструктор для intrusive_ptr увеличивает количество ссылок на ФОО. Звонит он явно дает вам преимущество быть в состоянии поиска для "FooPtr(" при попытке отследить каждое место в ФОО сохраняется. Кроме того, если функция Foo конструктор инициализирует его количество до 1, Вы можете ввести утечка памяти, полагаясь на неявный конструктор. Явное указание FooPtr(новый пакет(а, б, в), ложное) будет препятствовать этому.

2
ответ дан 25 октября 2011 в 02:10 Источник Поделиться