C++ move semantics

0
金具😷 @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

ん? operator ref<A>()の存在を見落としていた。これはなんだろう……引数なしのキャスト演算子?なんじゃそりゃ?

2009-12-07 12:58:42
金具😷 @cobodo

キャスト演算子は元々引数なしか。

2009-12-07 13:00:35
金具😷 @cobodo

なしというかthisが引数というか……

2009-12-07 13:01:10
金具😷 @cobodo

つまり、関数内ローカルのオブジェクトを返り値として返すためにコピーするときは、キャスト演算子とキャストされた型を(値渡しで!)引数に取るコンストラクタがあったらそっちを呼ぶってこと? なんで?

2009-12-07 13:04:43
金具😷 @cobodo

最後にref(ref&):p(other.get()){}コピーコンストラクタ足したら更にカオスなことになったwwwww 明日考えよう。

2009-12-07 13:13:20