Недавно я снова столкнулся с обозначением
( const int[10] ){ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }
Как я помню, это разрешено как на C, так и на С++, но с помощью довольно разных языковых механизмов.
Я полагал, что в С++ формальный вид состоит в том, что он является конструкцией неназванного временного с помощью преобразования типа epxlicit type (T)
cast-expression, которое сводится к static_cast
, который строит объект через С++ 11 § 5.2.9/4:
" выражение
e
может быть явно преобразовано в типT
с использованиемstatic_cast
формыstatic_cast<T>(e)
, если декларацияT t(e);
является корректной, для некоторых изобретенная временная переменнаяT
(8.5)
Однако синтаксис выражения-выражения определяется С++ 11 §5.4/2 как либо унарное выражение, либо рекурсивно, выражение (
type-id )
cast-expression, где единичный базовый регистр это сокращение до унитарного выражения.
И насколько я могу сказать, что сжатый init-list не является выражением?
Альтернативным представлением может быть то, что он преобразует явное преобразование типа через функциональную нотацию, С++ 11 §5.2.3/3,
" спецификатор простого типа или typename-спецификатор, за которым следует список бит-init, создает временную объект указанного типа
но насколько я могу сказать, что спецификатор простого типа может содержать круглые скобки, а спецификатор typename включает ключевое слово typename
?