Сегодня я увидел этот код внутри класса:
static const uint32_t invalid_index = ~uint32_t();
Мой вопрос: что такое возвращаемое значение деструктора uint32_t
и почему оно полезно?
Сегодня я увидел этот код внутри класса:
static const uint32_t invalid_index = ~uint32_t();
Мой вопрос: что такое возвращаемое значение деструктора uint32_t
и почему оно полезно?
Это не деструктор, а оператор побитовый NOT
, примененный к инициализированному значением uint32_t
.
Значение инициализированного интегрального типа 0
, поэтому вы берете поразрядный NOT
из 0
.
Аналогично:
uint32_t x = uint32_t(); // 32 0 in binary form
uint32_t y = ~x; // 32 1 in binary form
Прежде всего, как многие уже упоминали, код, который вы видели,
static const uint32_t invalid_index = ~uint32_t();
не является вызовом деструктора, но побитовое "not" ~
, применяемое к значению по умолчанию для типа uint32_t()
, то есть ~(uint32_t(0))
.
Теперь на ваш вопрос
Мой вопрос: каково возвращаемое значение деструктора uint32_t и почему оно полезно?
Возвращаемый тип псевдодеструктора (это не настоящий деструктор, а операция do-nothing с той же нотацией, что и вызов деструктора) void
, и это & rsquo; s главным образом полезно для типичного программирования где вы don & rsquo; t знает тип.
Пример:
uint32_t x;
x.~uint32_t(); // Silly but valid, a pseudo-destructor call.
Это не деструктор, он не двоичный. Здесь недопустимый индекс равен ~ uint32_t (0). Это 32-разрядное целое число без знака со всеми установленными битами. т.е. 0xffffffff.
Это побитовое НЕ, и его можно использовать для поиска дополнения (например, ~ 1011 = 0100) или в качестве промежуточного шага при попытке найти дополнение 2s (например, [~ 1011] + 0001 = 0101).