Это давно началось. Джавизация С++. Еще со Страуструпа с его давнишним "везде используйте std::vector вместо массива". Слава Богу, именно это безобразие не прижилось - появились std::array и прочие способы "спасти" zero-cost подход. Но тенденция такая сохраняется.
Обычный enum в С++ не работает "аналогично Си изначально". Я же ясно написал: неявного преобразования int -> enum в С++ нет и не было никогда. О том и речь.
Так и в С никто не хранит данные в юнионах долгосрочно именно потому, что может вдруг понадобиться реинтерпретация. Такой юнион возникает на сцене кратковременно, именно для этой цели. И исходные данные в него приходится загружать, а переинтерпретированный результат - выгружать.
Нет, в С++ так не происходит. enum class запрещает даже неявное преобразование в направлении enum -> int. А преобразования int -> enum в С++ не было никогда.
... как только память для массива выделена, имя массива воспринимается как константный указатель того типа, к которому отнесены элементы массива.
Я ранее уже подробно объяснил, что именно имеется в ввиду под утверждением "имя массива воспринимается как указатель". (Кстати, именно "воспринимается", а не "является".) Однако слово "константный" в его утверждении совершенно неуместно. То есть и Подбельский тут малость "несет чушь".
Почему?
Попробуйте скомпилировать этот код - и диагностическое сообщение компилятора вам детально расскажет, почему он некорректен.
int **b = &a;
Так мне представляется более корректным.
А вот это уже полнейшая бессмыслица. Здесь эту тему уже успели детально разжевать. "На колу мочало - начинай сначала"?
Речь, очевидно, идет о соседней статье о структуре блока памяти, создаваемой в С++ выражением new []. В нем действительно перед первым элементом может тайно храниться длина массива.
А при чем здесь именно синтаксическая корректность? Вот эта программа тоже является синтаксически корректной
int main()
{
int a = 42, a = 53, a = 128;
}
Понятие корректной программы в С и С++ выходит ооооочень далеко за рамки чисто синтаксической корректности, даже если мы ограничимся нарушениями, диагностика которых требуется стандартом языка. Но понятие корректной программы в С и С++ идет еще намного дальше и требует соблюдения и недиагностируемых правил тоже.
А, то есть вы нас обманывали. В самой программе этой "магии" не было, а вся она была спрятана в библиотечных средствах (напр., в заголовке), предоставляемым host environment? Тогда и говорить не о чем: внутренняя реализация этой библиотеки не имеет и не должена иметь никакого отношения к С++. Точно так же реализация обычной стандартной библиотеки языка С++ не имеет никакого отношения к С++.
Это примерно то же самое, что и значение в неинициализированной переменной. Не более чем "мусор", который, возможно, просто забыли за собой убрать. Никаких чудес в этом нет.
Если деструктор объекта, "который там уже был", тривиален, то никаких проблем нет. Лайфтайм этого объекта просто тихо заканчивается. Так в С++ было всегда.
Ну а если деструктор нетривиален, то начинаются нюансы. Хотя тащить их сюда смысла нет, ибо все это предназначено в первую очередь для буферов из unsigned char.
Если код порождает UB, он не имеет никакой языковой семантики, как вам уже не раз говорили. Никакие обещания с cppreference к нему не применимы.
Написанный вами огрызок - бессмысленный набор символов, в котором лишь вам лично мерещатся какие-то химеры вроде "volatile access", точно так же как маленькому ребенку ночью в висящем на стуле халате видится крадущийся Гойко Митич с томагавком в руке. С точки зрения языка С++ там нет ни "volatile", ни "access", ни чего-либо вообще.
Еще можно использовать
enum { s = 10 };
.Это давно началось. Джавизация С++. Еще со Страуструпа с его давнишним "везде используйте
std::vector
вместо массива". Слава Богу, именно это безобразие не прижилось - появилисьstd::array
и прочие способы "спасти" zero-cost подход. Но тенденция такая сохраняется.Я отношу такие фундаментальные фичи к "явным и очевидным" отличиям. Хотя, конечно, внешне они могут и не бросаться в глаза.
Еще раз: тема коллекции - правильный С код, который неправилен в С++. Именно в этом направлении.
Ваш пример интересен, но он "наоборот".
Обычный enum в С++ не работает "аналогично Си изначально". Я же ясно написал: неявного преобразования int -> enum в С++ нет и не было никогда. О том и речь.
Просто попробуйте.
Так и в С никто не хранит данные в юнионах долгосрочно именно потому, что может вдруг понадобиться реинтерпретация. Такой юнион возникает на сцене кратковременно, именно для этой цели. И исходные данные в него приходится загружать, а переинтерпретированный результат - выгружать.
Работает. Пока не перестанет.
Когда то и знаковое переполнение "работало", и реинтерпретация через каст, и указатели на локальные переменные "возвращались" и т.п.
Дойдут руки у авторов компиляторов - перестанет "работать".
В С++ специально для реинтерпретации есть
std::bit_cast
.Нет, в С++ так не происходит.
enum class
запрещает даже неявное преобразование в направлении enum -> int. А преобразования int -> enum в С++ не было никогда."всем их учить "? Может "всех им учить"?
Я ранее уже подробно объяснил, что именно имеется в ввиду под утверждением "имя массива воспринимается как указатель". (Кстати, именно "воспринимается", а не "является".) Однако слово "константный" в его утверждении совершенно неуместно. То есть и Подбельский тут малость "несет чушь".
Попробуйте скомпилировать этот код - и диагностическое сообщение компилятора вам детально расскажет, почему он некорректен.
А вот это уже полнейшая бессмыслица. Здесь эту тему уже успели детально разжевать. "На колу мочало - начинай сначала"?
Речь, очевидно, идет о соседней статье о структуре блока памяти, создаваемой в С++ выражением
new []
. В нем действительно перед первым элементом может тайно храниться длина массива.Это указатель на функцию, которая возвращает указатель.
А при чем здесь именно синтаксическая корректность? Вот эта программа тоже является синтаксически корректной
Понятие корректной программы в С и С++ выходит ооооочень далеко за рамки чисто синтаксической корректности, даже если мы ограничимся нарушениями, диагностика которых требуется стандартом языка. Но понятие корректной программы в С и С++ идет еще намного дальше и требует соблюдения и недиагностируемых правил тоже.
А, то есть вы нас обманывали. В самой программе этой "магии" не было, а вся она была спрятана в библиотечных средствах (напр., в заголовке), предоставляемым host environment? Тогда и говорить не о чем: внутренняя реализация этой библиотеки не имеет и не должена иметь никакого отношения к С++. Точно так же реализация обычной стандартной библиотеки языка С++ не имеет никакого отношения к С++.
Это примерно то же самое, что и значение в неинициализированной переменной. Не более чем "мусор", который, возможно, просто забыли за собой убрать. Никаких чудес в этом нет.
Если деструктор объекта, "который там уже был", тривиален, то никаких проблем нет. Лайфтайм этого объекта просто тихо заканчивается. Так в С++ было всегда.
Ну а если деструктор нетривиален, то начинаются нюансы. Хотя тащить их сюда смысла нет, ибо все это предназначено в первую очередь для буферов из
unsigned char
.Если код порождает UB, он не имеет никакой языковой семантики, как вам уже не раз говорили. Никакие обещания с cppreference к нему не применимы.
Написанный вами огрызок - бессмысленный набор символов, в котором лишь вам лично мерещатся какие-то химеры вроде "volatile access", точно так же как маленькому ребенку ночью в висящем на стуле халате видится крадущийся Гойко Митич с томагавком в руке. С точки зрения языка С++ там нет ни "volatile", ни "access", ни чего-либо вообще.
Это чушь. Как только на сцене появляется UB, никакого сгенерированного кода уже быть не может.
Добро пожаловать в мир С++