Может кто-нибудь объяснить мне, почему
тип наследования имеет значение в
этот случай? Бонусные баллы за
ссылка в стандарте.
Тип наследования не имеет значения. Имеет значение только то, что у вас есть доступное преобразование для одного из типов уловов. Так уж сложилось, что, поскольку это не публичное наследование, общедоступного преобразования не существует.
Пояснение:
Вы можете увидеть такое же поведение здесь:
class B
{
};
class C1 : B
{
};
class C2 : public B
{
};
int main(int argc, char** argv)
{
B& b1 = C1();//Compiling error due to conversion exists but is inaccessible
B& b2 = C2();//OK
return 0;
}
Брошенное исключение перехватывается блоком перехвата, только если:
- Блок catch имеет соответствующий тип или
- Блок catch предназначен для типа, имеющего доступное преобразование
- Блок catch - это улов (...)