Что говорит стандарт о следующем:
{
...
CheckedCall(ptr)->Fun(p1,p2,p3); //#1
...
} //#2
CheckedCall — оборачивает переданный указатель в небольшой объект и возвращает его (оператор -> соответственно перегружен). Так вот вопрос: в какой момент будет вызван деструктуор этого объекта? В точке #1 (т.е. по окончании вычисления выражения) или #2 (по выходу из области видимости)?
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Здравствуйте, trophim, Вы писали:
T>Что говорит стандарт о следующем:
T>T>{
T> ...
T> CheckedCall(ptr)->Fun(p1,p2,p3); //#1
T> ...
T>} //#2
T>
T>CheckedCall — оборачивает переданный указатель в небольшой объект и возвращает его (оператор -> соответственно перегружен). Так вот вопрос: в какой момент будет вызван деструктуор этого объекта? В точке #1 (т.е. по окончании вычисления выражения) или #2 (по выходу из области видимости)?
В точке #1:
12.2/3 (ISO/IEC 14882:2011)
R>When an implementation introduces a temporary object of a class that has a non-trivial constructor (12.1, 12.8), it shall ensure that a constructor is called for the temporary object. Similarly, the destructor shall be called for a temporary with a non-trivial destructor (12.4). Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception. The value computations and side effects of destroying a temporary object are associated only with the full-expression, not with any specific subexpression.