当我使用unique_ptr
创建deleter
时,它有效:
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr(new Animal<Cat>, [](Animal<Cat> *ls) {
delete ls;
});
但是,这段代码引发了错误:
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr;
ptr = std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)>(new Animal<Cat>, [](Animal<Cat> *ls) {
delete ls;
});
错误:
/usr/bin/../lib/c++/v1/memory:2561:13: error: static_assert failed "unique_ptr constructed with null function pointer deleter"
static_assert(!is_pointer<deleter_type>::value,
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: in instantiation of member function 'std::__1::unique_ptr<Animal<Cat>, void (*)(Animal<Cat> *)>::unique_ptr' requested here
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr;
^
这是我的编译器版本:
Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
动物和猫类是微不足道的。 This is the entire code
答案 0 :(得分:11)
在阅读了Casey上面的答案之后,我改变了我的代码,使用了很好的旧Functor而不是lambda来使它工作。
这是我的解决方案:
struct Deleter {
void operator()(Animal<Cat>* ls) {
delete ls;
}
};
int main() {
std::unique_ptr<Animal<Cat>, Deleter> ptr;
ptr = std::unique_ptr<Animal<Cat>, Deleter>(new Animal<Cat>);
return 0;
}
答案 1 :(得分:10)
显然不可能默认构造一个带有删除器指针类型的unique_ptr
。 unique_ptr
构造函数在§20.7.1.2.1[unique.ptr.single.ctor]中有详细说明,其中包括:
constexpr unique_ptr() noexcept;
4 备注:如果使用指针类型或模板的引用类型实例化此构造函数 参数
D
[删除者类型],该程序格式不正确。
类似于你想要的标准符合:
unique_ptr<int, void(*)(int*)> ptr{nullptr,[](int*p){delete p;}};
// ...
ptr.reset(new int(42));