Я тоже сначала засомневался насчет временного объекта, но решил себя проверить и быстро воткнул код в проект, что был под рукой. Сработало так, как будто объект был не временным, я даже порадовался и решил запомнить на будущее. Сейчас попробовал воспроизвести, не получилось ни там, ни на чистом проекте. Может быть, это такие шутки minimal rebuild.
Но в случае нормального объекта все-таки лучше смотреть на обработчик. Поскольку
struct A
{
int m_i;
A(int i):m_i(i)
{
cout << "A::A " << m_i << endl;
}
~A()
{
cout << "A::~A " << m_i << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a(1);
try
{
A a(2);
throw 0;
}
catch (...)
{
cout << "catch" << endl;
}
return 0;
}
---
выдаст
A::A 1
A::A 2
A::~A 2
catch
A::~A 1
---
И если класс Lock из первого поста предназначался для защиты от совместного использования некого ресурса, к которому вдруг есть обращение в обработчике исключения, первый вариант окажется надежнее.
|