Вычисляет ли `goto` время жизни объекта C ++? - PullRequest
4 голосов
/ 23 марта 2020

Regular goto в C ++ учитывает время жизни объекта - при использовании goto для выпрыгивания из блока будут запускаться деструкторы для соответствующих локальных переменных.

start:
NonTrivial object;
if (again()) goto start;  // will call object.~NonTrivial()

То же самое верно при использовании обозначает как значение * расширение 1007 *?

start:
NonTrivial object;
goto *(again() ? &&start : &&end);
end:

G CC с радостью принимает этот код, но, похоже, игнорирует любой эффект, который goto может оказать на время жизни object. лязг жалуется. Ищите вызовы NonTrivial() и ~NonTrivial() в Проводник компилятора .

Какой компилятор работает правильно? Можно ли вообще поддерживать этот вид косвенного ветвления, а также правильно управлять временем жизни объекта и RAII?

...