| |||
![]()
|
![]() ![]() |
![]()
Про throw Есть такой забавный факт - throw в C++ является не оператором, а операцией - чтобы можно было писать что-то вроде: (p == NULL ? throw BadPointer (p) : *p) При этом возникают понятные проблемы с его типом - поскольку никакого осмысленного типа, кроме void, throw в C++ приписать понятно что нельзя. При этом однако возникает трабл - что тип условного выражения получался бы void, что малосодержательно. Потому есть просто специально обученное правило, что в таком условном выражении его типом является тип того варианта, который ничего не кидает. Проблему это отчасти фиксит, но если throw захочется засунуть в какую-нибудь функцию (я обычно завожу ее для выкидывания обломов) - работать не будет. Решение у трабла по идее простое - заводится парный к void тип - any, который является супертипом всех типов (а значений, как и void не имеет). В функциональных языках примерно так и сделано - только для этих целей используется тип forall a.a, но вот почему кажется ни в одном вообще процедурном языке такого не делали - загадка (в Algol-68, где в аналогичном контексте можно было писать goto, было придумано специально обученное преобразование типа, которое умело преобразовывать goto во что угодно - проблему в общем случае это тоже не решало) |
||||||||||||||
![]() |
![]() |