【发布时间】:2011-06-15 02:53:54
【问题描述】:
我从 Visual C++ 2010 中获得了 warning C4355: 'this' : used in base member initializer list:
我有一个持有句柄的类,我想自动关闭句柄即使该类的 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,但这需要单独定义。
我的问题:警告是否与此特定实例有关?无论哪种方式,详细原因是什么?有什么简单的方法可以避免吗?
【问题讨论】:
-
您的 lambda 是否必须捕获所有内容 (
[&])?如果你只是让它[](或[&_log])会发生什么? -
还是同样的问题,因为_log真的是this->_log。 [&lg] 虽然有效。
-
哦,当然——没有
this,您无法访问_log,但您可以访问lg。对不起!
标签: c++11 closures shared-ptr unique-ptr initializer-list