为什么地址运算符获得的指针不是左值?

She*_*ohn -2 c c++

我很想知道为什么&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以某种方式"指导编译器",所以为什么不这样呢?

fre*_*low 9

在我看来,你想改变一个对象的地址,对吧?那是不可能的.每个对象在其整个生命周期中都有固定的地址.您永远不能为对象提供不同的地址.对象的地址隐含在生成的机器代码中,它本身不会存储在任何地方.

  • 机器代码中没有名称.编程语言中的名称只是程序员避免考虑偏移的便捷方式.如果"hans"现在意味着"对象在地址0x1234","对象在地址0x5678"之后,那么hans的当前地址必须存储在其他一些不移动的地方,因此每个需要访问hans的机器指令都可以找到他现在住的地方.每次访问汉斯都必须经历这种额外的间接.或者,您必须重写访问hans的每个机器指令.移动GC做的那种:) (3认同)
  • 实际上,编译器必须检测到您的代码可能在变量上使用此功能,并在内部将该变量实现为指针.在这种情况下,由于存在别名风险,它还必须禁用许多优化. (3认同)