在 C++ 中,这样的语句是有效的:
&Variable;
IMO 它没有任何意义,所以我的问题是,如果你这样做,它会以任何方式影响编译结果,还是编译器会优化它?
考虑这个片段:
#include <iostream>
class A {
public:
A* operator &() {
std::cout << "aaa" << std::endl;
return this;
}
};
int main() {
A a;
&a;
return 0;
};
在这种情况下,
"&a;"
将生成代码。
值得记住的是,operator&() 可能会针对变量类型进行重载,产生一些副作用,并且优化此类语句会改变程序行为。
一个例子是用于控制非 C++ 对象的智能指针 - _com_ptr_t。 它有一个重载的 _com_ptr_t::operator&() ,它检查内部指针是否已经存储了一些非空地址。如果事实证明存储的地址非空,则意味着指针已经附加到某个对象。如果发生这种情况,_com_ptr_t::operator&() 会断开该对象 - 调用 IUnknown::Release() 并将指针设置为 null。
这里的副作用是必要的,因为典型用法是这样的:
_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;
优化它会改变程序行为。
这完全取决于您使用的编译器和编译选项。 C++ 标准中没有任何内容可以阻止编译器为此类语句生成代码。
您想删除它,但担心可能会改变程序的行为吗?
如果变量的类覆盖运算符地址(operator&),可能会产生副作用。
是的,这样的说法很可能会被优化。这意味着获取对变量的引用并将其丢弃。虽然在“无优化”设置下,您的编译器可能会为此语句生成一些代码,但它本质上是无操作,并且通过优化,该语句应该消失。
您似乎引用了堆栈或寄存器上的局部变量。了解编译器当前执行的操作的最佳方法是查看 Visual Studio 中的“反汇编”视图。