我从Visual c得到warning C4355: 'this' : used in base member initializer list
++ 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)))
关闭,但是这需要一个单独的定义。
我的问题:这个具体实例的警告是一个问题吗?无论哪种方式,详细原因是什么?有没有一种简单的方法来避免它?
您的lambda是否必须捕获所有内容('[&]')?如果你只是做了'[]'(或'[&_log]')会发生什么? – 2011-06-15 05:45:34
仍然是同样的问题,因为_log实际上是这个 - > _ log。 [&lg]虽然工作。 – 2011-06-15 19:21:22
哦,当然 - 你不能在没有'this'的情况下访问'_log',但是你可以访问'lg'。抱歉! – 2011-06-15 19:34:11