Потому что когда вы пишете ~AB()
, вы не называете и не вызываете деструктор. Вы пишете ~
, за которым следует имя класса, и вызов деструктора автоматически предоставляется в результате указанной семантики записи этих токенов рядом друг с другом.
Обычно это академично, но здесь вы понимаете, почему это может иметь значение.
Аналогично, при написании AB()
вы не «вызываете конструктор», даже если это похоже на вызов функции, и многие новички языка интерпретируют код таким образом. (Это может привести к веселью и играм при попытке вызвать конструктор шаблона без вывода аргументов: без возможности назвать конструктор, эти аргументы не могут быть предоставлены!)
Фактически, ни конструктор, ни деструктор технически даже не имеют имя!
Эти нюансы делают C ++ забавным, верно?