Указатель buffer
является «lvalue», bu т, когда операция литья применяется к нему, выражение:
(char*) buffer
является «Rvalue» (на самом деле «изменяемый Rvalue» - но я думаю, что имеет значение только в наступающем C++ 0x). Неконстантные ссылки не могут быть привязаны к значениям r.
Однако const ссылки могут быть связаны с rvalues.Таким образом, следующая модификация вашей программы компилируется:
void foo(char* const& p) // added 'const'
Стефан Т. Lavavej недавно опубликовал запись в блоге, который имеет большую информацию о lvalues, rvalues и ссылки:
Статья на самом деле о новых «ссылках на rvalue», которые поступают в C++ 0x, но имеет большое объяснение того, что такое lvalues и rvalues, и как они могут и не могут работать со ссылками на C++ 98. Это долго читается, но очень хорошо стоит.
Я думаю, что ChrisW на самом деле исправил ошибку в вашем коде во время редактирования ... вы выбрали BYTE * для (char) вместо (char *). – UncleZeiv
Не так, вы не можете передавать временную ссылку, отличную от константы, поэтому ошибка все еще существует: приведение создает временное и которое не может быть передано по ссылке. –
@UncleZeiv История изменений говорит, что я сделал, но я не помню, как это делалось. Я не могу это объяснить. Может быть, кто-то еще, OP даже, делает параллельное редактирование? – ChrisW