Из С++ Primer 18.1.1:
Если выражение [throw] имеет массив или тип функции, выражение преобразуется в соответствующий тип указателя.
Как получается, что эта программа может производить корректный вывод 9876543210
(g++ 5.2.0)?
#include <iostream>
using namespace std;
int main(){
try{
int a[10] = {9,8,7,6,5,4,3,2,1,0};
throw a;
}
catch(int* b) { for(int i = 0; i < 10; ++i) cout << *(b+i); }
}
Из цитаты throw a
создаст объект исключения типа int*
, который является указателем на первый элемент массива. Но, конечно, элементы массива a
будут уничтожены при выходе из блока try
и введите предложение catch, так как мы изменим область блока? Я получаю ложное положительное значение или элементы массива "оставлены в покое" (не удаляются) в течение срока действия предложения catch?