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;
};
私はここで何が間違っているのですか?
ポリモーフィック関数ラッパーを使用しており、デフォルトの構築では空で構築されます。
したがって、呼び出し時に例外がスローされます。
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
で、はのターゲットオブジェクト(20.9.1)です*this
。
2戻り値:がの場合R
は何もありません。void
それ以外の場合はの戻り値ですINVOKE (f, std::forward<ArgTypes>(args)..., R)
。
3スロー:bad_function_call
if!*this
; それ以外の場合は、ラップされた呼び出し可能オブジェクトによってスローされた例外。
最初に何かを入れる前/に削除ツールを設定すればdata
、すべて問題ありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加