const 参照をエミュレートするクラステンプレートが実装可能か?つまり以下のようなクラステンプレート
template<class T> class const_reference { ????? };
があったとして,
int i; double d; const_reference<int> rci1(i); // i への const 参照として振舞う const_reference<int> rci2(1); // 一時オブジェクトの 1 は rci の寿命まで延命される const_reference<double> rcd1(d); // int -> double への変換後,変換によって生じた // 一時オブジェクトへの const 参照となり, // かつその一時オブジェクトの寿命を延命 const_reference<double> rcd2(2); // 上と同様 struct Base{}; struct Derived : public Base{}; Derived drv; const_reference<Base> rcb(drv); // drv への const 参照として振舞う
上記のように振舞うように実装することが可能かどうか,という問題.実際に捕捉している参照へのアクセスは(どうせ C++ ではスマートリファレンスは実装できないので)スマートポインタと同じアクセス方法(operator*, operator->)で妥協するものとする.
#あ,これ自分が本来想定していた問題より相当難しいかも知れない…….っつーか,これ本当に実装できるのか?
#あ〜,これ無理.これが可能になるためには任意の型に対して右辺値と const 左辺値が識別できないといけないけれど,それは無理.とゆ〜か,それができるなら Move Semantics バンバン書き倒すっちゅーねん.
#あれ?ということは const 参照の初期化では,少なくともコンパイラが右辺値と const 左辺値を識別する能力が微妙に露見しているわけだから,その情報を何とか捕捉できるような TMP の技法があれば……まぁ無理か.
#おろ?おろろ?いや,やっぱ const 参照エミュレーションできるんじゃ??
#できた…….