Деструкторы встроенных типов (интервал, символ и т.д.)

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

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

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

typedef int myint;

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

Почему второе кодирует работу? Интервал получает деструктор просто, потому что это был typedefed?

В случае, если Вы задаетесь вопросом, почему когда-либо можно было бы хотеть сделать это: Это прибывает из рефакторинга кода C++. Мы удаляем стандартную "кучу" и заменяем ее, самодельными пулами. Это требует, чтобы мы назвали новым для размещения и деструкторы. Я знаю, что вызов деструкторов для типов примитивов бесполезен, но мы хотим их в коде, тем не менее в случае, если мы позже заменяем ПЕРЕХОДНЫЕ ПРИСТАВКИ реальными классами.

При обнаружении, что явный интервал не работает, но typedefed делают было настоящее удивление.

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

59
задан Ayxan 4 August 2019 в 10:00
поделиться

1 ответ

Это - причина, которая заставляет Ваш код работать на универсальные параметры. Рассмотрите контейнер C:

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

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

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

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

92
ответ дан Johannes Schaub - litb 24 November 2019 в 18:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: