Я получаю warning C4355: 'this' : used in base member initializer list
из Visual C ++ 2010:
У меня есть класс, содержащий дескриптор, и я хочу автоматически закрыть дескриптор , даже если 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 чем-то вроде _handle(nullptr, bind(PortDeleter, placeholders::_1, ref(_log)))
, но для этого требуется отдельное определение.
Мои вопросы: предупреждение относится к этому конкретному случаю? В любом случае, в чем детальная причина? Есть ли тривиальный способ избежать этого?