С точки зрения референтного объекта, то, что код может манипулировать при заданной константной ссылке, совпадает с тем, что он может делать с указателем на константный объект, и аналогично тому, что он может манипулировать при неконстантной ссылке, совпадает с указатель на неконстантный объект.
То, что ссылка не позволяет вызываемой функции, - это изменение объекта, на который ссылается ссылка, или арифметика указателя на ссылку.
В терминах вызывающей стороны константная ссылка может быть привязана непосредственно к r-значению, и у вас есть четко определенная семантика при создании и уничтожении объектов, передаваемых в качестве аргументов. Это распространенная идиома - создать временный аргумент для аргумента:
// declaration
void bar ( const Foo& );
// use
bar ( Foo() );
Но не сразу очевидно, что объект Foo в них имеет продолжительность жизни, превышающую длину вызова функции:
// declaration
void bar ( const Foo* );
// use
Foo temp;
bar ( &temp );
// cast to avoid warning about taking address of temporary
bar ( &static_cast<const Foo&>( Foo() ) );
// helper function to same effect
template<typename T> const T* address_of ( const T& t) { return &t; }
bar ( address_of ( Foo() ) );
Хотя очевидно, что последний, будучи просто вызовом функции, должен сделать это очевидным.
По сути, ссылки являются синтаксическим сахаром для указателей, которые указывают на отдельные объекты, а не на начало массивов.