Given a value, increase the ref count and return the new reference.
The returned representation should be a different value if double indirection
is used (each value is a pointer to the smart pointer), or the same value
if single indirection is used (the value is pointing to the object itself).
Given a value, increase the ref count and return the new reference. The returned representation should be a different value if double indirection is used (each value is a pointer to the smart pointer), or the same value if single indirection is used (the value is pointing to the object itself).