Я не могу придумать истинный язык RAII, который также имеет оптимизацию хвостовых вызовов в спецификациях, но я знаю, что многие реализации С++ могут сделать это как оптимизацию для конкретной реализации.
Это задает вопрос для тех реализаций, которые делают: учитывая, что деструкторы вызываются в конце области автоматической переменной, а не отдельной процедурой сбора мусора, не нарушает ли ограничение TCO, что рекурсивный вызов должен быть последним инструкции в конце функции?
Например: -
#include <iostream>
class test_object {
public:
test_object() { std::cout << "Constructing...\n"; }
~test_object() { std::cout << "Destructing...\n"; }
};
void test_function(int count);
int main()
{
test_function(999);
}
void test_function(int count)
{
if (!count) return;
test_object obj;
test_function(count - 1);
}
"Constructing..." будет написано 999 раз, а затем "Destructing..." еще 999 раз. В конечном счете, 999 test_object
экземпляров будут автоматически распределены до размотки. Но при условии, что реализация имеет TCO, будет существовать 1000 кадров стека или всего лишь 1?
Связано ли деструктор после рекурсивного вызова с требованиями к реализации TCO для дефакто?