alignment-specifier Может быть применена к переменной или к элементу данных класса, но оно не должно быть применено к битовое поле, параметр функции или exception-declaration([except.handle]). Также alignment-specifierможет применяться к объявлению или определению класса (в elaborated-type-specifierили class-head, соответственно) и к объявлению или определению перечисления (в opaque-enum-declarationили enum-head, соответственно ([dcl.enum])). alignment-specifierМноготочием является pack expansion.
Когда alignment-specifierимеет форму :alignas( constant-expression )
constant-expressionявляется неотъемлемой константным выражением
если постоянное выражение не оценивается как значение выравнивания ([basic.align]) или оценивается как расширенное выравнивание, а реализация не поддерживает это выравнивание в контексте объявления, программа имеет неправильный формат.
Элемент alignment-specifierформы имеет тот же эффект, что и ( ).alignas( type-id ) alignas(alignof( type-id )) [expr.alignof]
Требование выравнивания объекта - это строжайшее ненулевое выравнивание, указанное в нем alignment-specifiers, если таковое имеется; в противном случае alignment-specifiers не действуют.
Комбинированный эффект all alignment-specifiers в объявлении не должен указывать менее строгое выравнивание, чем выравнивание, которое потребовалось бы для объявляемого объекта, если бы все, alignment-specifiers относящееся к этому объекту, было опущено. [ Example:
struct alignas(8) S {};
struct alignas(1) U {
S s;
}; // error: U specifies an alignment that is less strict than if the alignas(1) were omitted.
— end example ]
Если определяющее объявление объекта имеет alignment-specifier, любое не определяющее объявление этого объекта должно либо указывать эквивалентное выравнивание, либо не иметь alignment-specifier. И наоборот, если какое-либо объявление объекта имеет alignment-specifier, каждое определяющее объявление этого объекта должно указывать эквивалентное выравнивание. Диагностика не требуется, если объявления объекта имеют alignment-specifiers разные единицы перевода. [ Example:
// Translation unit #1: struct S { int x; } s, *p = &s; // Translation unit #2: struct alignas(16) S; // error: definition of S lacks alignment, no diagnostic required extern S* p;
— end example ]
[ Example: Выровненный буфер с требованием выравнивания A и содержащими N элементы типа T может быть объявлен как:
alignas(T) alignas(A) T buffer[N];
Указание alignas(T) гарантирует, что окончательное запрошенное выравнивание не будет слабее alignof(T), и, следовательно, программа не будет плохо сформирована. ] — end example
[ Example:
alignas(double) void f(); // error: alignment applied to function alignas(double) unsigned char c[sizeof(double)]; // array of characters, suitably aligned for a double extern unsigned char c[sizeof(double)]; // no alignas necessary alignas(float) extern unsigned char c[sizeof(double)]; // error: different alignment in declaration
— end example ]