正在阅读Nicholai Jossutis,STL 书。有一个部分像
D d; // instance of the deleter type
unique_ptr<int, const D&> p4(new int, D()); // Error: rvalue deleter object
// can’t have reference deleter type
我不明白,所以我创造了一些其他场景。
有人可以解释一下这些场景为什么它们有效或无效吗?
#include <memory>
class C_deleter_functor
{
public:
void operator()(int* iptr) const
{
delete iptr;
}
};
class deleter_functor
{
public:
void operator()(int* iptr)
{
delete iptr;
}
};
int main()
{
C_deleter_functor d1;
deleter_functor d2;
std::unique_ptr<int, const C_deleter_functor&> up1(new int, d1); // 1.OK
std::unique_ptr<int, const deleter_functor&> up2(new int, d2); // 2.ERROR
std::unique_ptr<int, const C_deleter_functor&> up3(new int, C_deleter_functor{}); // 3.ERROR
std::unique_ptr<int, const deleter_functor&> up4(new int, deleter_functor{}); // 4.ERROR
}
我没有这本书,所以我不知道上下文,但我觉得很奇怪,Nico 的示例使用引用类型参数化 unique_ptr 。
如果使用非引用参数,大多数问题都会消失:
int main()
{
C_deleter_functor d1;
deleter_functor d2;
std::unique_ptr<int, C_deleter_functor> up1(new int, d1); // 1.OK
std::unique_ptr<int, deleter_functor> up2(new int, d2); // 2.OK
std::unique_ptr<int, C_deleter_functor> up3(new int, C_deleter_functor{}); // 3.OK
std::unique_ptr<int, deleter_functor> up4(new int, deleter_functor{}); // 4.OK
}
https://godbolt.org/z/Tb351ocqM
如果您放置引用参数,那么您将作为成员类注入引用,这会使事情变得非常混乱。
这也带来了为什么不复制删除器的概念问题。 删除程序不应该有太多的状态来试图阻止它的副本。 甚至更少的可变状态(如你的第二堂课)