Составные литералы для скалярных типов
Поскольку c99
составные литералы могут использоваться, например, для инициализации указателей:
int *p = (int []) {1, 2, 3, 4};
в то время как это обычно используется для struct
s также может использоваться для инициализации анонимных массивов (см. пример). Но если я правильно понял, инициализирую скалярный указатель следующим образом:
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. Таким образом, приведение к квалифицированному типу имеет тот же эффект, что и приведение к неквалифицированной версии типа.