使用std :: function对象将自定义删除器传递给std :: unique_ptr

时间:2014-07-06 22:30:27

标签: c++ c++11 lambda unique-ptr std-function

我有以下工作代码来使用自定义删除器初始化std::unique_ptr

class Dataset
{
    ...
private:
    class CustomGDALDatasetDeleter {
    public:
            void operator()(GDALDatasetH res) const {
                ::GDALClose(res);
            }
    };
    using ResourceType = std::unique_ptr<GDALDataset,
                                         CustomGDALDatasetDeleter>;
    ResourceType data;
};

后来我有了这段代码:

data = ResourceType(static_cast<GDALDataset*>(::GDALOpen(filename.c_str(),
                                              static_cast<GDALAccess>(mode)))
);

当我使用std::function对象和lambdas尝试相同操作时,我得到bad_function_call例外:

class Dataset
{
    ...
private:
    std::function<void (GDALDatasetH)> del = [](GDALDatasetH res){::GDALClose(res);};
    using ResourceType = std::unique_ptr<GDALDataset,
                                         decltype(del)>;
    ResourceType data;

};

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

您正在使用多态函数包装器,而在默认构造时将其构造为空
因此,它会在调用时抛出异常。

  

function() noexcept;

template <class A> function(allocator_arg_t, const A& a) noexcept;  
     

2后置条件:!*this

  

20.9.11.2.4函数调用[func.wrap.func.inv]

     
R operator()(ArgTypes... args) const
         

1效果:INVOKE (f, std::forward<ArgTypes>(args)..., R)(20.9.2),其中f*this的目标对象(20.9.1)。
    2返回:Rvoid时无效,否则为INVOKE (f, std::forward<ArgTypes>(args)..., R)的返回值。
    3投掷:bad_function_call如果!*this;否则,包装的可调用对象抛出的任何异常。

  

在您第一次将某些内容放入data之前/之前设置删除,一切正常。