Стоит помнить, что оператор & () может быть перегружен для типа переменной, иметь некоторые побочные эффекты, и оптимизация такого оператора может изменить поведение программы.
Одним из примеров является умный указатель, используемый для управления объектами не-C ++ - _com_ptr_t .
Он имеет перегруженный _com_ptr_t :: operator & (), который проверяет, хранит ли указатель внутри какой-либо ненулевой адрес. Если оказывается, что сохраненный адрес не нулевой, это означает, что указатель уже прикреплен к какому-либо объекту. Если это происходит, _com_ptr_t :: operator & () отключает объект - вызывает IUnknown :: Release () и устанавливает указатель на ноль.
Побочный эффект здесь необходим, потому что типичное использование:
_com_ptr_t<Interface> pointer;
// some other code could be here
CoCreateInstance( ..., &pointer, ...);// many irrelevant parameters here
CoCreateInstance () или другой код поиска объекта не имеет представления о C ++ и _com_ptr_t, поэтому он просто перезаписывает переданный в него адрес. Вот почему _com_ptr_t :: operator & () должен сначала освободить объект, к которому прикреплен указатель, если таковой имеется.
Итак, для _com_ptr_t это утверждение:
&variable;
будет иметь тот же эффект, что и
variable = 0;
и его оптимизация изменила бы поведение программы.