金具😷
@cobodo
move constructorが呼ばれるのは何故なんだろう。関数の返り値としてオブジェクトが返される場合に、A(A*)みたいな"ポインタ・コンストラクタ"が呼ばれる、と仮定すれば、ref<T>(T*)というコンストラクタがあるが故にオーバーロードされてA(ref<A>)が(続く
2009-12-07 12:47:05
金具😷
@cobodo
呼ばれるのだ、と考えられるけど、だからといってA(ref<A>)を削ってA(A*)を用意すると、"A four = fred();"と"two = fred();"で"no matching function for call to ‘A::A(A)’"と(続く
2009-12-07 12:51:37
金具😷
@cobodo
g++-4.4.1-4ubuntu8さんに怒られる。つまりポインタ・コンストラクタなんて無いのだ。じゃぁなんでA(ref<A>)が呼ばれるの? .
2009-12-07 12:52:33
金具😷
@cobodo
あと、copy constructor from const lvalueを作るのに、わざわざenable_if_sameなんていうテンプレート特殊化を利用したトリッキーな判定をする意味がよくわからない。普通にA(const A&)でも同じじゃないのかな……
2009-12-07 12:55:26
金具😷
@cobodo
つまり、関数内ローカルのオブジェクトを返り値として返すためにコピーするときは、キャスト演算子とキャストされた型を(値渡しで!)引数に取るコンストラクタがあったらそっちを呼ぶってこと? なんで?
2009-12-07 13:04:43
金具😷
@cobodo
最後にref(ref&):p(other.get()){}コピーコンストラクタ足したら更にカオスなことになったwwwww 明日考えよう。
2009-12-07 13:13:20