Деструкторы встроенных типов (int, char и т. Д.) - PullRequest
57 голосов
/ 19 января 2009

В C ++ следующий код выдает ошибку компилятора:

void destruct1 (int * item)
{
  item->~int();
}

Этот код почти такой же, я просто определяю int для другого типа, и происходит что-то волшебное:

typedef int myint;

void destruct2 (myint * item)
{
  item->~myint();
}

Почему работает второй код? Получает ли int деструктор только потому, что он был определен по типу?

В случае, если вам интересно, почему кто-то когда-либо хотел это сделать: это происходит из-за рефакторинга кода C ++. Мы удаляем стандартную кучу и заменяем ее самодельными пулами. Это требует от нас называть размещение новых и деструкторов. Я знаю, что вызывать деструкторы для примитивных типов бесполезно, но, тем не менее, мы хотим, чтобы они были в коде на случай, если позже мы заменим POD реальными классами.

Обнаружение, что голые int не работают, а typefed делают, было довольно неожиданным.

Кстати - у меня есть решение, которое включает шаблонные функции. Мы просто печатаем внутри шаблона и все в порядке.

1 Ответ

89 голосов
/ 19 января 2009

Это причина того, что ваш код работает для общих параметров. Рассмотрим контейнер C:

template<typename T>
struct C {
    // ...
    ~C() {
        for(size_t i = 0; i<elements; i++)
            buffer[i].~T();
    }
};

Было бы неприятно вводить специальные случаи для встроенных типов. Таким образом, C ++ позволяет вам делать все вышеперечисленное, даже если T равно int. Священный Стандарт говорит в 12.4 p15:

Нотация для явного вызова деструктора может использоваться для любого имени скалярного типа. Это позволяет писать код без необходимости знать, существует ли деструктор для данного типа.

Разница между использованием простого int и typedef'а int заключается в том, что они синтаксически разные вещи. Правило состоит в том, что в вызове деструктора вещь после ~ является именем типа. int не такая вещь, но имя-типа-определения. Посмотрите это в 7.1.5.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...