Составные литералы для скалярных типов

Поскольку c99 составные литералы могут использоваться, например, для инициализации указателей:

int *p = (int []) {1, 2, 3, 4};

в то время как это обычно используется для structs также может использоваться для инициализации анонимных массивов (см. пример). Но если я правильно понял, инициализирую скалярный указатель следующим образом:

int *p = &(int) {4};

также действует. Что меня смущает, так это утверждение о gcc сайт, который "Составные литералы для скалярных типов и типов объединения также разрешены, но тогда составной литерал эквивалентен приведению". Они просто означают, что с помощью оператора address-of & перед анонимным скаляром есть форма приведения?

1 ответ

Решение

По определению составной литерал не состоит из & адрес оператора. От N1570 6.5.2.5/p3 Составные литералы:

Постфиксное выражение, которое состоит из имени типа в скобках, за которым следует заключенный в скобки список инициализаторов, является составным литералом.

Теперь их утверждение:

Составные литералы для скалярных типов и типов объединения также допускаются, но тогда составной литерал эквивалентен приведению.

довольно неправильно, если я читаю это правильно. Принципиальное различие между составным литералом и оператором приведения состоит в том, что первый является lvalue, как у N1570 6.5.2.5/p4 (выделение мое):

В противном случае (когда имя типа указывает тип объекта), тип составного литерала соответствует типу, указанному в имени типа. В любом случае результатом является lvalue.

в то время как последний нет, 6.5.4/p5 Операторы броска (акцент мой):

Предшествующий выражению имя в скобках типа преобразует значение выражения в именованный тип. Эта конструкция называется литой.104)

104) Приведение не дает lvalue. Таким образом, приведение к квалифицированному типу имеет тот же эффект, что и приведение к неквалифицированной версии типа.

Другие вопросы по тегам