xorで値のスワップ

まあ、常識みたいなもんかもしれませんが、今かこうと思った。

void swap(signed &l,signed &r){
  l ^= r; // L = R XOR L
  r ^= l; // R = R XOR (R XOR L) = (R XOR R) XOR L = 0 XOR L = L
  l ^= r; // L = L XOR R = (R XOR L) XOR (L) = R XOR (L XOR L) = R XOR 0 = R
}

こうするべきなのか?

template <typename T>
void swap(T &l,T &r){
	l ^= r;
	r ^= l;
	l ^= r;
}

こうか?

template <typename T>
void swap(T &l,T &r){
	l ^= r ^= l ^= r; // 副作用完了点とか未定義とかどうだったっけ
}

もちろん、現実で2つの値を交換する場面で a^=b^=a^=bとかやってはいけませんよ。
(でも面倒な時は十分良いイディオムとなってくれるので、使うかも…)