Как chris упоминалось в комментарии, написать пустой Deleter:
#include <type_traits>
template <typename T>
struct empty_delete
{
empty_delete() /* noexcept */
{
}
template <typename U>
empty_delete(const empty_delete<U>&,
typename std::enable_if<
std::is_convertible<U*, T*>::value
>::type* = nullptr) /* noexcept */
{
}
void operator()(T* const) const /* noexcept */
{
// do nothing
}
};
Пример использования:
#include <iostream>
#include <memory>
struct noisy
{
noisy() { std::cout << "alive" << std::endl; }
~noisy() { std::cout << "dead" << std::endl; }
noisy(const noisy&);
noisy& operator=(const noisy&);
};
template <typename T>
void take(T& yours)
{
std::cout << "Taking..." << std::endl;
{
auto mine = std::move(yours);
}
std::cout << "Took." << std::endl;
}
int main()
{
std::unique_ptr<noisy> a(new noisy());
std::shared_ptr<noisy> b(new noisy());
std::unique_ptr<noisy, empty_delete<noisy>> c(new noisy());
std::shared_ptr<noisy> d(new noisy(), empty_delete<noisy>());
take(a);
take(b);
take(c);
take(d);
}
Выход:
живых
живых
живой
alive
... ...
Взятие ...
dead
Took.
Принимая ...
Принимал.
Принимая ...
Принимал.
Конечно, этот пример утечки памяти.
Вы могли бы дать ему пустой пролет. – chris
ПОЧЕМУ вы хотели бы это сделать? i уже находится в стеке, поэтому нет смысла использовать интеллектуальный указатель - на самом деле, как вы видите, умный указатель закручивает его. Если вам нужно передать указатель на него где-нибудь, используйте raw pointer from & i –
@chris. Это должно работать. Я, вероятно, займусь этим решением. Благодаря! – woodings