2015-03-05 4 views
16
inline void my_assert(bool cond, const std::exception &e = my_assert_failed()) 
{ 
    if (!cond) 
     throw e; 
} 

Стандарт гарантирует, что:Бросок временный аргумент, передаваемый по ссылке

Временная граница с опорным параметром в вызове функции (5.2.2) сохраняется до завершения полного выражения не содержащая вызов.

И брошенного временный объект:

Временная сохраняется до тех пор, пока обработчик выполняется для этого исключения.

Могу ли я сделать вывод о том, что временное, которое передается my_assert, сохраняется до тех пор, пока блок catch не завершится?

+3

Параметр 'throw' [выражение] (http://en.cppreference.com/w/cpp/language/throw) выполняет копия его аргумента, чтобы вы не бросали временные. – user657267

+4

@ user657267 Это ответ. – Angew

ответ

9

От N4296 (первый проект после окончательного C++, 14) [15.1p3]:

вызов исключения копирования инициализирует (8,5, 12,8) временный объект, называется объект исключения. Временной является значением lvalue и используется для инициализации переменной, объявленной в соответствующем обработчике (15.3).

Таким образом, вы не можете предположить, что ваш временный «переживает бросок». Если вы выбрали, в качестве аргумента будет вызываться конструктор копирования объекта исключения типа std::exception с e. Временное, что привязано к e, будет уничтожено, когда элемент управления оставляет полное выражение, содержащее вызов, my_assert (либо после нормального возврата, либо как часть разворачивания стека, поскольку вы условно выбрасываете исключение).

Есть обстоятельства, при которых может быть Опущенные копия строительство объекта исключения, но это не один из них, в соответствии с [12.8p31.2]:

- в вбрасывания выражении (5,17), когда операндом является имя энергонезависимого автоматического объекта (, кроме функции или параметра catch -класса , параметр), объем которого не выходит за пределы самого внутреннего , включающего блок try (если есть один), операция копирования/перемещения от операнд к объекту исключения (15.1) может быть опущен построения автоматического объекта непосредственно в объект исключения

(курсив мой)

+1

Отличный ответ, точный и звуковой. Отредактировал вопрос, чтобы обострить «выживает бросок». –

Смежные вопросы