Когда неявно вызывается деструктор?
Прошу перечислить возможные варианты 
Вариант единственный: деструктор в C++ вызывается ровно в тот момент, когда уничтожается объект.
Всё. Точка.
Никаких других "вариантов" нет и быть не может, потому что в C++ не может быть сборки мусора.
А вот когда объект уничтожается - тут могут быть некоторые варианты: явное и неявное уничтожение, уничтожение по выходу из блока, уничтожение по эпилогу программы... Здесь разница уже в том. что называют "время жизни" объекта.
Драфт стандарта n3337:
Destructors are invoked implicitly
— for constructed objects with static storage duration (3.7.1) at program termination (3.6.3),
— for constructed objects with thread storage duration (3.7.2) at thread exit,
— for constructed objects with automatic storage duration (3.7.3) when the block in which an object is created exits (6.7),
— for constructed temporary objects when the lifetime of a temporary object ends (12.2),
— for constructed objects allocated by a new-expression (5.3.4), through use of a delete-expression (5.3.5),
— in several situations due to the handling of exceptions (15.3).