我很想知道为什么&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);
}
..但显然,编译器不这么认为。:(
编辑:我明白为什么这不起作用。也许我的问题会这样更清楚:我不知道一个变量在程序中有多少属性,但至少有一个名称、一个值、一个地址,也许还有一些关于它生命周期的指示。对我来说,交换本质上是重命名存储在内存中的两个现有值,而且它会产生副本是无稽之谈。
有了我放弃的这个“可怕”的代码示例,我想做的是对编译器说:“从现在开始,b 被命名为 a,反之亦然”。为什么这样的事情是不可能的?动机是已经有可能以某种方式“指导编译器”,例如通过 TMP,那么为什么不这样做呢?