Это потому, что «приведение» в составном литерале вовсе не приведение - оно просто выглядит как единое целое.
Составной литерал (который является полной конструкцией (int){5}
) создает lvalue. Однако оператор приведения создает только значение r, как и большинство других операторов.
Этот пример будет разрешен (но бесполезен, как и ваши int
примеры):
++((char *){(char *)p});
&((char *){(char *)p});