r is not an auto-decodable string (i.e. a narrow string or a
user-defined type that implicitly converts to a string type), then r is returned.
Otherwise, r is converted to its corresponding string type (if it's not already a string) and wrapped in a random-access range where the element encoding type of the string (its code unit) is the element type of the range, and that range returned. The range has slicing.
If r is quirky enough to be a struct or class which is an input range of characters on its own (i.e. it has the input range API as member functions), and it's implicitly convertible to a string type, then r is returned, and no implicit conversion takes place.
If r is wrapped in a new range, then that range has a source property for returning the string that's currently contained within that range.