我有以下工作代码来使用自定义删除器初始化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;
};
我在这里做错了什么?
答案 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返回:R
为void
时无效,否则为INVOKE (f, std::forward<ArgTypes>(args)..., R)
的返回值。
3投掷:bad_function_call
如果!*this
;否则,包装的可调用对象抛出的任何异常。
在您第一次将某些内容放入data
之前/之前设置删除,一切正常。