Почему не может быть модифицируемым значением lvalue типа массива?

Из стандарта C11 (§6.3.2.1 Lvalues, массивы и обозначения функций):

Модифицируемое значение lvalue – это значение lvalue, которое не имеет типа массива, не имеет неполного типа, не имеет типа, соответствующего const, и если оно является структурой или объединением, не имеет какого-либо члена (включая, рекурсивно, любой член или элемент всех содержащихся агрегатов или объединений) с категориальным типом.

От C в двух словах:

Модифицируемое значение lvalue является значением lvalue, которое не объявляется как const -qualified «Type Qualifiers» на стр. 180) и не имеет типа массива .

В чем причина того, что модифицируемое значение lvalue не может иметь тип массива?

Является ли объект типа массива всегда неявным const?

Дизайнеры языка C решили, что нельзя назначать массивы по значению. В то время это казалось разумным решением (в начале 1970-х годов) – скорость памяти и процессора была очень ограниченной, и они считали, что a = b; make a и b оба относятся к одному и тому же массиву – это было бы гораздо более распространенным намерением, чем a = b; используется для копирования содержимого одного массива в другой.

На самом деле это уже было обычное использование: на языке программирования B (предшественник C) эквивалент int a[10]; на самом деле означало выделить как указатель, так и блок из 10 целых чисел и указать указатель на блок из 10 целых чисел. Фактически вы можете сделать массив «точкой» в другом месте в B.

C изменил значение определения массива, что он выделяет только блок int; и добавил «Правило»: когда вы используете имя массива в выражении присваивания (и большинстве других выражений), массив неявно преобразуется в указатель на первый элемент. Итак, если a является указателем, а b является массивом, вы все равно можете написать a = b; чтобы вести себя как псевдоним для b . Хотя вы больше не можете иметь a = b; где a – массив.

В первом стандарте ANSI C в 1989 году они добавили возможность копировать структуры по значению (это существовало в некоторых компиляторах ранее, но не было универсальным), с тем следствием, что если структура содержит массив, то массив будет скопирован по значению. Но было слишком поздно возвращаться и менять смысл a = b; для копирования массивов по значению было написано слишком много кода, который уже зависит от правила.

Ссылка: Развитие языка C – Деннис М. Ричи