Я только сегодня узнал, что произошло одно (несколько) существенное изменение между N1570 и окончательным стандартом C11 (ISO / IEC 9899: 2011 (E)).
В N1570, 6.3.2p3 говорит:
За исключением случаев, когда это операнд оператора sizeof
, _Alignof
оператор, или унарный оператор &
, или строковый литерал, используемый для
инициализировать массив, выражение, которое имеет тип "массив тип "
преобразуется в выражение с типом «указатель на тип », которое указывает
к начальному элементу объекта массива и не является lvalue.
Включение _Alignof
было ошибкой, поскольку синтаксис унарного выражения разрешает
_Alignof ( type-name )
но не
_Alignof unary-expression
Опубликованный стандарт C11 исправляет эту ошибку и возвращается к формулировке C99:
За исключением случаев, когда это операнд оператора sizeof
или
унарный оператор &
, или строковый литерал, используемый для инициализации массива,
выражение, имеющее тип "массив тип ", преобразуется в
выражение с типом «указатель на тип », которое указывает на начальный
элемент массива и не является lvalue.
Дополнительная информация: в недавней публикации на comp.std.c о различиях между N1570 и выпущенным стандартом Ларри Джонс, член комитета ISO C, написал:
Есть несколько из них, но большинство из них являются лишь незначительными редакционными изменениями,
изменения в шаблонный текст, и перемешивание вещей, чтобы сохранить
силы, которые будут счастливы. Самым большим изменением было удаление _Alignof из
куча мест, которые не должны были быть добавлены (на основании ошибочных
представление о том, что требуется либо тип, либо выражение типа sizeof.
когда он действительно принимает только тип): 6.3.2.1p2, p3, p4, fn. 65; а также
6.7.1 фн. 121.
Идентификатор сообщения: <rfg33a-u0q.ln1@jones.homeip.net>
Вот нить , как видно на groups.google.com.