Ответ 1
Кажется, что я должен дважды подумать перед публикацией, потому что он ударил меня сразу после того, как я это сделал.
Мое понимание того, как sizeof
взаимодействует с VLA, действительно корректно, поскольку следующая цитата подтверждает (спасибо @this!):
6.5.3.4 Операторы
sizeof
и_Alignof
Если тип операнда - тип массива переменной длины, то операнд оценивается; в противном случае операнд не оценивается, а результат представляет собой целочисленную константу
Это не то, что вызывает это удивительное (мне) поведение.
(void)sizeof (g(2), arr);
В подвыражении (g(2), arr)
, оператор запятой запускает arr
распад матрицы на указатель. Таким образом, операнд sizeof
больше не является VLA, а простой char*
, и он возвращается, чтобы не оценивать его операнд.
Видимо, это поведение было изменено на С++, где оператор запятой больше не будет распадать массивы.