初始化器列表(C ++ 0x)中的闭包删除器和编译器警告

|| 我从Visual C ++ 2010中获得了“ 0”: 我有一个持有手柄的类,并且即使该类的ctor失败(因此不调用其dtor),我也想自动关闭该手柄。但是,我不想打扰整个句柄包装类,而是将其保存在一个智能指针中。所以我这样写:
foo.h
~~~~~
class Foo
{
    ...
    Log &_log;
    std::unique_ptr<void, std::function<void (void *)>> _handle;
    ...
}

foo.cpp
~~~~~~~
#include <windows.h>
Foo::Foo(Log &lg, ...) : _log(lg), ... _handle(nullptr, [&](void *h){ if (h) { if (!CloseHandle(h)) LOG(_log, \"Could not close port: \" << LastWinErr()); h = nullptr; } })
{
    HANDLE h(CreateFile( ...
    if (h == ...
    _handle.reset(h);
    ... // Bunch of other stuff that could potentially throw
}
在关闭之前,我使用类似
_handle(nullptr, bind(PortDeleter, placeholders::_1, ref(_log)))
的方法初始化_handle,但这需要单独的定义。 我的问题是:警告是否与此特定情况有关?不管哪种方式,具体原因是什么?有没有简单的方法可以避免这种情况?     
已邀请:
        简短的是,如果您传递
this
指针,并且该指针用于访问初始化程序列表或析构函数Bad Things Happen™中的成员函数或变量。如果您知道这种情况不会发生,请随时忽略该警告。当然,这也是一个很好的警告-如果您在析构函数中访问的任何函数或变量都属于该类,那么这是不安全的,因为您可能在构造它们之前/破坏之后访问它们。如果您知道初始化/销毁的顺序,问题并不严重,但通常是一个不好的举动,因为这会使维护工作变得轻而易举。因为您可以捕获构造函数参数,所以我建议这样做。     

要回复问题请先登录注册