Указатель buffer
является "lvalue", но когда к нему применяется операция приведения, выражение:
(char*) buffer
- это «значение» (на самом деле «изменяемое значение» - но я думаю, что это имеет значение только в грядущем C ++ 0x). Неконстантные ссылки не могут быть привязаны к значениям.
Однако, const ссылки могут быть связаны с rvalues. Поэтому следующая модификация вашей программы будет скомпилирована:
void foo(char* const& p) // added 'const'
Стефан Т. Лававей недавно опубликовал запись в блоге, в которой содержится отличная информация о lvalues, rvalues и ссылках:
В действительности статья посвящена новым «ссылкам на rvalue», появившимся в C ++ 0x, но в ней дано прекрасное объяснение того, что такое lvalues и rvalue, и как они могут и не могут работать со ссылками в C ++ 98. Это долгое чтение, но оно того стоит.