All streams
Search
Write a publication
Pull to refresh
37
0
Send message

Еще можно использовать enum { s = 10 };.

Это давно началось. Джавизация С++. Еще со Страуструпа с его давнишним "везде используйте std::vector вместо массива". Слава Богу, именно это безобразие не прижилось - появились std::array и прочие способы "спасти" zero-cost подход. Но тенденция такая сохраняется.

Я отношу такие фундаментальные фичи к "явным и очевидным" отличиям. Хотя, конечно, внешне они могут и не бросаться в глаза.

Еще раз: тема коллекции - правильный С код, который неправилен в С++. Именно в этом направлении.

Ваш пример интересен, но он "наоборот".

Обычный enum в С++ не работает "аналогично Си изначально". Я же ясно написал: неявного преобразования int -> enum в С++ нет и не было никогда. О том и речь.

Просто попробуйте.

Так и в С никто не хранит данные в юнионах долгосрочно именно потому, что может вдруг понадобиться реинтерпретация. Такой юнион возникает на сцене кратковременно, именно для этой цели. И исходные данные в него приходится загружать, а переинтерпретированный результат - выгружать.

Работает. Пока не перестанет.

Когда то и знаковое переполнение "работало", и реинтерпретация через каст, и указатели на локальные переменные "возвращались" и т.п.

Дойдут руки у авторов компиляторов - перестанет "работать".

В С++ специально для реинтерпретации есть std::bit_cast.

Нет, в С++ так не происходит. enum class запрещает даже неявное преобразование в направлении enum -> int. А преобразования int -> enum в С++ не было никогда.

"всем их учить "? Может "всех им учить"?

... как только память для массива выделена, имя массива воспринимается как константный указатель того типа, к которому отнесены элементы массива.

Я ранее уже подробно объяснил, что именно имеется в ввиду под утверждением "имя массива воспринимается как указатель". (Кстати, именно "воспринимается", а не "является".) Однако слово "константный" в его утверждении совершенно неуместно. То есть и Подбельский тут малость "несет чушь".

Почему?

Попробуйте скомпилировать этот код - и диагностическое сообщение компилятора вам детально расскажет, почему он некорректен.

int **b = &a;

Так мне представляется более корректным.

А вот это уже полнейшая бессмыслица. Здесь эту тему уже успели детально разжевать. "На колу мочало - начинай сначала"?

Речь, очевидно, идет о соседней статье о структуре блока памяти, создаваемой в С++ выражением new []. В нем действительно перед первым элементом может тайно храниться длина массива.

int * (*p)(void);

— это уже функция, которая возвращает указатель. Надеюсь, я ничего не перепутал. Поправьте, если что.

Это указатель на функцию, которая возвращает указатель.

А при чем здесь именно синтаксическая корректность? Вот эта программа тоже является синтаксически корректной

int main()
{
  int a = 42, a = 53, a = 128;
}

Понятие корректной программы в С и С++ выходит ооооочень далеко за рамки чисто синтаксической корректности, даже если мы ограничимся нарушениями, диагностика которых требуется стандартом языка. Но понятие корректной программы в С и С++ идет еще намного дальше и требует соблюдения и недиагностируемых правил тоже.

А, то есть вы нас обманывали. В самой программе этой "магии" не было, а вся она была спрятана в библиотечных средствах (напр., в заголовке), предоставляемым host environment? Тогда и говорить не о чем: внутренняя реализация этой библиотеки не имеет и не должена иметь никакого отношения к С++. Точно так же реализация обычной стандартной библиотеки языка С++ не имеет никакого отношения к С++.

И тем не менее он генерируется. Чудеса, не иначе

Это примерно то же самое, что и значение в неинициализированной переменной. Не более чем "мусор", который, возможно, просто забыли за собой убрать. Никаких чудес в этом нет.

Если деструктор объекта, "который там уже был", тривиален, то никаких проблем нет. Лайфтайм этого объекта просто тихо заканчивается. Так в С++ было всегда.

Ну а если деструктор нетривиален, то начинаются нюансы. Хотя тащить их сюда смысла нет, ибо все это предназначено в первую очередь для буферов из unsigned char.

Если код порождает UB, он не имеет никакой языковой семантики, как вам уже не раз говорили. Никакие обещания с cppreference к нему не применимы.

Написанный вами огрызок - бессмысленный набор символов, в котором лишь вам лично мерещатся какие-то химеры вроде "volatile access", точно так же как маленькому ребенку ночью в висящем на стуле халате видится крадущийся Гойко Митич с томагавком в руке. С точки зрения языка С++ там нет ни "volatile", ни "access", ни чего-либо вообще.

А я утверждаю, что UB - это прежде всего behaviour. Компилятор всегда на строчку `*((volatile int*)0x3) = 1` сгенерирует один и тот же код.

Это чушь. Как только на сцене появляется UB, никакого сгенерированного кода уже быть не может.

Добро пожаловать в мир С++

Information

Rating
Does not participate
Registered
Activity