#include <iostream>
using namespace std;
int main() {
int a = 3;
cout<<"Address of a = "<<&a<<endl;
try{
throw a;
}catch(int& s){
cout<<"Address of s = "<<&s<<endl;
}
return 0;
}
Выход:
Адрес a = 0x7ffee1c9b38
Адрес s = 0x7fbdc0405900
Почему адреса a и s разные??
У них разные адреса, потому что это разные объекты. От cppreference о throw
:
throw expression
[...]
- Во-первых, копирование-инициализация объекта исключения из выражения
[...]
Причина перехвата по ссылке не столько в том, чтобы избежать копирования, сколько в том, чтобы правильно перехватывать исключения, которые наследуются от других. Для int
это не имеет значения.
Любопытно, вот как вы можете получить ссылку на a
в блоке catch:
#include <iostream>
struct my_exception {
int& x;
};
int main() {
int a = 3;
std::cout << "Address of a = " << &a << '\n';
try {
throw my_exception{a};
} catch(my_exception& s) {
std::cout << "Address of s = " << &s.x << '\n';
}
}
Возможный вывод:
Address of a = 0x7ffd76b7c2d4
Address of s = 0x7ffd76b7c2d4
PS: На всякий случай, если вам интересно, я изменил больше в вашем коде, потому что Почему «используя пространство имен std;» считается плохой практикой? , "std::endl" vs "\n" , и потому что return 0 избыточен в main.
@RitobrotoGanguly main
возвращает 0
по умолчанию, вам не нужно его писать
о. Я всегда думал, что это конкретная реализация компилятора.
@RitobrotoGanguly en.cppreference.com/w/cpp/language/main_function -> специальные свойства 4)
С моими компиляторами "\n"
немного лучше, чем '\n'
, потому что последний упакован в char[2]
из {c, '\0'}
(где c
в данном случае '\n'
), а затем вызывает подпрограмму char const*
. Но это только компиляторы, которые я использую, и это деталь реализации; и другие компиляторы могут сделать это по-другому. Во всяком случае, вероятно, хорошо оптимизируется на -O1
или лучше.
@Элджей, это интересно. Я обычно использую "\n"
просто потому, что так удобнее печатать, в этот раз я хотел сделать это "правильно". На самом деле меня не слишком волнует производительность стандартного вывода, потому что он все равно медленный.
Как возврат 0 избыточен?