I am designing a class that behaves like a C++ references but does some extra instrumental stuff (bookkeeping).
Initially I thought that std::reference_wrapper<T>
would be a good model. But after a while I realized that std::reference_wrapper<T>
doesn't behave, even in principle, as a C++ reference because assignment rebinds the internal pointer.
double a = 5.;
double b = 3.;
double& ref = a;
ref = b;
assert(&ref != &b); // ref is not bound to b
std::reference_wrapper<double> refwpr = a;
refwpr = b;
assert(&refwpr.get() == &b); // ref wrapper was rebound to b
I can of course change that behavior for my own class (not to rebind) but I though that maybe a class that emulates a reference is already out there. For example something like "std::real_reference<T>
".
Is there a class (standard or not) that emulates references more closely?
I think it can be useful too, for example in many places one sees
std::vector<std::reference_wrapper<T>>
presented as an alternative to std::vector<T&>
but this is misleading because the semantics is different but could be achieved with some modifications std::vector<std::real_reference<T>>
.
I now think that if a "perfect" reference wrapper were possible, then references could be just implemented with pointers and we wouldn't need T&
but just simply have a library feature reference<T>
that works exactly like T&
in all respects....
... which in turn means that the language could allow you to "overload" the &
attribute over types to produce a custom type instead of a language reference. For example using mytype& = custom_reference_emulator_of_mytype
.
std::reference_wrapper
? If not, why not just implement your own version with everything included but the operator overload for copy assignment? – Myiasisoperator&
to return the same as&a
, that is (something convertible to) a pointer to the original object. But I left that out of the question. (In fact I have to overload a lot of operators to make it behave like a real reference and evenoperator.
if that were possible.) open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4173.pdf – Auctioneerreference_wrapper
doesn't try to behave as a reference - it simply wraps one. If you want the underlying reference, use.get()
. – Coaly