C++で参照をthrowしたらどうなるの?

どこかの呟きを見てたら、定数を参照を引数に持つ関数には渡せるけど、const型でなければコンパイルエラーになる。
だがthrowなら例外的に定数を投げても、const型でない参照でcatchしてくれる、というもの。


その方のコードを見ると、以下の感じでした。


constとconstでない参照の引数を持つそれぞれの関数へ、定数を受け取らせる。
(定数はconstでなければならないので、エラーになる部分があり、そこはコメントアウト。)
http://codepad.org/auK6dXX7


定数の参照をcatchさせる(constでなくてもcatchする)
http://codepad.org/NKgebuPg


これを見て疑問に思ったのが、constでない場合をcatchしたとき、例外中に中身を書き換えされたら、
定数を書き換えてしまう事になってしまうんじゃないのかな?
以前、const外しをやって、定数は書き換えられない事から、それは不可能なはず。
参照を渡したのではなく、参照先のコピーを取ってるんじゃないのかな?と考えたところ、
大体あってたようです。
http://www.fides.dti.ne.jp/~oka-t/cpplab-exception.html


参照はスローできないようで、参照でcatchしようとしても、実はコピーされてます。
そもそも定数の参照を返す関数を見つけると、コンパイラが警告を出します。


上のcatchさせるコードを少し変更した物がこちら。
http://codepad.org/1iyaXVFR
まず、int &でcatchしたら、参照のアドレスと、参照先の値を表示し、i++と加算します。
次に、const int &でcatchしたら、参照のアドレスと、参照先の値を表示します。
僕の環境では参照のアドレスはどちらも等しくなり、int &でi++;しているにもかかわらず、
const int &では値は変化していない事を見ると、やはりコピーを取っていると考えるのが自然だと思います。
デバッガで処理を追えれば判ると思うんだけど、使いこなせません><


ちなみに、err関数の定数をconst int &で定義して、throwしても、const int &,int &で受け取る事ができますが、
err関数のconst int &のアドレスと、catchした方でのアドレスは異なります。
このことからも、参照が機能していないことがわかります。ただの値渡しなので、コピーコンストラクタが呼び出されるのも納得です。
ただポインタでは動作が違い、期待していた通りの動作をしてくれます(文字列定数をchar *ではcatchできない等)