unique_ptr自定义删除器的不同场景

问题描述 投票:0回答:1

正在阅读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
}
c++ c++11 smart-pointers unique-ptr
1个回答
0
投票

我没有这本书,所以我不知道上下文,但我觉得很奇怪,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

如果您放置引用参数,那么您将作为成员类注入引用,这会使事情变得非常混乱。

这也带来了为什么不复制删除器的概念问题。 删除程序不应该有太多的状态来试图阻止它的副本。 甚至更少的可变状态(如你的第二堂课)

© www.soinside.com 2019 - 2024. All rights reserved.