&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);
}
..しかし、明らかに、コンパイラはそうは考えていません。:(
編集:これが機能しない理由を理解しています。多分私の質問は次のように明確になるでしょう: プログラム内で変数がいくつのプロパティを持っているかはわかりませんが、少なくとも名前、値、アドレス、およびおそらくその寿命の兆候です。問題は、私にとって、スワッピングは本質的にメモリに保存されている 2 つの既存の値の名前を変更することであり、コピーが発生することはナンセンスです。
そこであきらめたこの「恐ろしい」コード例で、私がやろうとしているのは、コンパイラーに「これからは、b は a という名前になり、その逆も同様です」と言うことです。なぜそんなことが出来ないのでしょうか?動機は、たとえば TMP を介して、ある意味で「コンパイラに指示する」ことがすでに可能であるということです。