Исходя из вашего чтения, 1,2
не является константным выражением.Я не знаю, почему это не так, просто я согласен с вами, что это не так (несмотря на то, что, вероятно, так и должно быть).
6.5.2 определяет составные литералы в качестве постфиксного оператора.Так что в
(union { uint32_t i; float f; }){ 1 }.f
операндами являются (union { uint32_t i; float f; }){ 1 }
и f
для оператора .
.Это не арифметическое константное выражение, поскольку первый аргумент имеет тип union
, но это константное выражение.
ОБНОВЛЕНИЕ: Я основывал это на другой интерпретациистандарт.
Мои предыдущие рассуждения заключались в том, что (union { uint32_t i; float f; }){ 1 }.f
удовлетворял критериям постоянного выражения и поэтому являлся постоянным выражением.Я все еще думаю, что оно соответствует критериям для постоянного выражения (пункт 6.6 пункта 6), но это не какой-либо из стандартных типов постоянных выражений (целочисленное, арифметическое или адресное) и поэтому является предметом постоянного выражения только в пункте 6.6.10, которая допускает определяемые реализацией константные выражения.
Я также хотел получить ваше редактирование.Я собирался утверждать, что «взломанная» реализация offsetof
была константным выражением, но я думаю, что это то же самое, что и выше: оно соответствует критериям для константного выражения (и, возможно, адресной константы), но не является целочисленной константой.выражение, и, следовательно, является недействительным за пределами 6.6 пункта 10.