Всем программистам C++ хорошо известно, как получить адрес области памяти, где хранится значение переменной - нужно задействовать оператор взятия адреса (&). Оператор этот унарный. При этом есть и бинарный оператор &, который реализует операцию побитового И. Но нас он совсем не интересует. 

Также, программистам C++ хорошо известно и то, что операторы можно перегружать. И, наверное, хотя бы раз в жизни все пробовали перегрузить для своего собственного типа какой-нибудь оператор (например, [ ]), в надежде, что это упростит работу с данным типом.

Однако не все операторы могут быть перегружены. Например, оператор .  или :: не могут быть перегружены, да и сложно себе представить, чтобы из этого вышло. Представьте, Вы вызвали sizeof для типа T,  и получили в результате 0, потому что кому-то так захотелось. А ведь результат от вызова  sizeof очень часто используется в знаменателе, и никогда не должен быть равен 0.

Но унарный оператор &, оказывается можно перегрузить! Зачем это нужно, кто так делает и как же в этом случае "взять адрес" читайте далее.