コピー演算子、代入演算子

自分用メモ。C++でメンバ変数にスマートポインタ系のものがいる場合にはコピー演算子や代入演算子に注意を払っておかないと(勝手にだけど)ひどい目に合う。例えば左の木構造をコピーしようと思ったら差しているポインタがコピー元のleafではなく新しいほうのを指すように注意しておかなければならない(本当は点線のほうを指すようにしたい)。

コピーや代入の意味がどっちを指すか自分で定義できる、という意味ではいいのだが慣れないとはまる。RubyとかPythonでいうところのdeep copyとshallow copyの問題と似ている(例えばこんなのとか)。

ポインタのメンバ変数だけこういうことをやればいいのかと思ったら、そういうことはなくてメンバ変数一つ一つについてコピーや代入の意味がどういうことかを書いてやらなければならない。代入演算子とコピー演算子にほとんど似たようなことを書かないといけない気がしてすごい不毛な気分になるが、この付近は独自にswap関数を定義しておくとましになるらしい(コピーのコストも低くなるとか)。この付近はExceptional C++―47のクイズ形式によるプログラム問題と解法 (C++ in‐Depth Series)のp51付近に載っている。