我很想知道为什么&a = &b在C++中不允许使用类似的赋值.
我理解这样做的风险,但至少对我来说,完全禁止它是不够的理由.我之所以这么想是因为我正在寻找一种智能的方式来交换大型对象而不需要复制,这样的东西似乎是一个好主意:
void ptr_swap( ptrdiff_t &a, ptrdiff_t &b )
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
int main()
{
double a = 157648.13;
double b = 96871.84;
printf("%.4f %.4f\n", a, b);
ptr_swap( reinterpret_cast<ptrdiff_t>(&a), reinterpret_cast<ptrdiff_t>(&b) );
printf("%.4f %.4f\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)
..但显然,编译器并不这么认为.:(
编辑:我理解为什么这不起作用.也许我的问题会更清楚:我不知道变量在一个程序中有多少属性,但至少有一个名称,一个值,一个地址,以及它的生命周期的一些指示.问题是,对我来说,交换本质上是重命名存储在内存中的两个现有值,并且它会产生副本是无稽之谈.
我放弃了这个"可怕的"代码示例,我要做的就是对编译器说:"从现在开始,b被命名为a,反之亦然".为什么这样的事情不可能?动机是,已经可以通过TMP以某种方式"指导编译器",所以为什么不这样呢?
在我看来,你想改变一个对象的地址,对吧?那是不可能的.每个对象在其整个生命周期中都有固定的地址.您永远不能为对象提供不同的地址.对象的地址隐含在生成的机器代码中,它本身不会存储在任何地方.