我從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