указатель.
фективном современном C ++» Скотта Мейера обсуждается использованиеstd::unique_ptr
с пользовательским средством удаления и состояниями:
Удалители, которые являются указателями на функции, обычно вызывают размерstd::unique_ptr
расти от одного слова до двух. Для средств удаления, которые являются объектами функции, изменение размера зависит от того, сколько состояния хранится в объекте функции. Функциональные объекты без сохранения состояния (например, из лямбда-выражений без перехватов) не подвергаются штрафу за размер, и это означает, что когда пользовательское средство удаления может быть реализовано либо как функция, либо как лямбда-выражение без захвата, лямбда-выражение является предпочтительным.
Как пример, это:
auto delInvmt1 = [](Investment* pInvestment) {
makeLogEntry(pInvestment);
delete pInvestment;
};
template<typename... Ts>
std::unique_ptr<Investment, decltype(delInvmt1)>
makeInvestment(Ts&&... args);
лучше чем это:
void delInvmt2(Investment* pInvestment) {
makeLogEntry(pInvestment);
delete pInvestment;
}
template<typename... Ts>
std::unique_ptr<Investment, void (*)(Investment*)>
makeInvestment(Ts&&... params);
Я вижу, что во втором случае указатель на функцию удаления должен быть сохранен вunique_ptr
, но почему ничего подобного не нужно хранить для лямбда-кейса?