【发布时间】:2014-08-27 08:44:19
【问题描述】:
我有以下工作代码来使用自定义删除器初始化 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;
};
我在这里做错了什么?
【问题讨论】:
-
您可能没有将删除器的副本传递给指针构造函数。
-
一种可能更容易理解的看待它的方式是,编译器应该如何判断从知道删除器是
std::function<void (GDALDatasetH)>到知道它需要调用GDALClose?除了del本身之外,没有任何内容包含该信息,unique_ptr对del一无所知。 -
是的,你是对的。据我了解,问题的原因是
std::unqiue_ptr,当给定两个模板类型参数时,会尝试默认构造一个删除器类型的对象。但根据定义 lambda 没有,这会导致删除器为空。
标签: c++ c++11 lambda unique-ptr std-function