bool value1 = new bool(true);
new
не возвращает указатель на выбранный тип?bool
? int value1 = new int(1);
- компилятор ругается. bool *
. Откуда вы вдруг взяли "указатель на void" - не ясно. New-expression никогда не возвращает "указатель на void".bool
. Именно это и используется в вашем примере.bool
является сужающим (narrowing). Это означает что оно, в частности, больше не будет выполняться неявно в контексте списковой инициализацииbool value1{ new bool(true) }; // Ошибка
bool
может быть только два значения 0 или 1.bool
будет преобразовано в 1.bool
, где значение указателя эквивалентное nullptr
будет означать false
, а любое другое значение указателя - true
.bool
и обратно по очевидным причинам будет приводить к потере информации и не позволит восстановить исходный указатель. std::unitptr_t
и обратно, то можно было бы ожидать сохранения значения указателя. Если бы мы приводили к другому указательному типу и обратно, то можно было бы ожидать сохранения значения указателя. А к bool
и обратно - никаких шансов. bool
не был тайпдефом. bool
- это ключевое слово языка С++.bool
был бы тайпдефом, он был бы тайпдефом на какой-нибудь разумно выбранный целочисленный тип. Какового в общем случае было бы совершенно недостаточно для сохранения указателя без потерь. true
и нет false
. И в каждой библиотеке есть свое определение булевых операций._Bool
с семантикой булева значения и строго определенными операциями. Только мало кто про это знает даже сегодня.enum
и неявного преобразования указателей из void *
.