У меня небольшие затруднения с пониманием того, что вы спрашиваете, но ... Во-первых, не называйте переменную вашего улова тем же именем, что и ваша локальная переменная, то есть вы дважды используете «a» для представленияразные вещи.Вы можете подумать, что предмет, который вы ловите по ссылке, это a, который вы передали в foo, и это не будет правдой, если foo () выдает B. Просто для ясности измените ваш улов на
catch (const A& ex)
{
...ex.message()...
}
Я подозреваюв том случае, если объявлено вне попытки, a все еще находится в области видимости, а a.message () вызывает локальную переменную a .Если объявлено внутри try, a больше не находится в области видимости в улове, поэтому a , который вы перехватываете по ссылке, вызывает его сообщение.Изменение имени переменной улова должно устранить, казалось бы, неоднозначное поведение.