- 【初心者歓迎】C/C++室 Ver.91【環境依存OK】
555 :デフォルトの名無しさん[age]:2014/07/05(土) 15:18:14.89 ID:Im7i5kcd - 複数のメンバをコンストラクタの引数で初期化するようなクラスを作ってんですが、
なるべく高速に動作させたいので、const参照以外にも右辺値参照も受け取れるよう にしたいんですが、 class C { private: const M1 m1; const M2 m2; public: C(const M1 &x1, const M2 &x2): m1(x1), m2(x2) {} C(M1 &&x1, const M2 &x2): m1(x1), m2(x2) {} C(const M1 &x1, M2 &&x2): m1(x1), m2(x2) {} C(M1 &&x1, M2 &&x2): m1(x1), m2(x2) {} }; こんなかんじで、2のメンバ数乗個のコンストラクタを書かずに済む方法ってありますか? クラスM1やM2には、コピーコンストラクタとムーブコンストラクタが定義済みってことで。
|
- 【初心者歓迎】C/C++室 Ver.91【環境依存OK】
558 :555[sage]:2014/07/05(土) 20:49:00.54 ID:Im7i5kcd - >>556
http://codepad.org/IWIjpHFC やってみたけどうまくいかなかった。 クラスC1をコンストラクトする段階で、M1やM2のコピーコンストラクタが move可能な状況でも呼ばれる。 C2みたいに書いてようやく所望の動作をしてくれたんだが・・・ 初期化リストにいちいちstd::move()とか書かないといけないもんなの? もうすこしシンプルな書き方知っている方おしえてです。
|
- 【初心者歓迎】C/C++室 Ver.91【環境依存OK】
559 :555[sage]:2014/07/05(土) 20:55:30.71 ID:Im7i5kcd - これじゃコンストラクタ引数で初期化したいメンバが4個も5個もあると軽く死ねる。。。
>>557 いみわからんです。値渡しを避けたいから可能な限りムーブを使うんだが。
|
- 【初心者歓迎】C/C++室 Ver.91【環境依存OK】
562 :555[sage]:2014/07/05(土) 21:15:06.00 ID:Im7i5kcd - >>560-561
でも、そのコードだとm1オブジェクトがぶっ壊れるんだが。 http://ideone.com/fZ7eB6
|
- 【初心者歓迎】C/C++室 Ver.91【環境依存OK】
563 :555[sage]:2014/07/05(土) 21:20:22.29 ID:Im7i5kcd - あ、>>560のコードのバグだな。
c2dのコンストラクタ呼び出しで、不要なmoveが入ってる。 どうもわかってきた。サンクス。
|
- 【初心者歓迎】C/C++室 Ver.91【環境依存OK】
565 :555[sage]:2014/07/05(土) 21:32:06.45 ID:Im7i5kcd - うん、書き込んでから、そういう意図かな、と気づいた。
ただ激しくバグの素の匂いがするコードなのであまり関心できない。 あとは、このムーブのオーバーヘッドを無視できるかだなぁ。。。 あと、値渡しコンストラクタ引数が初期化リストで一回使われるだけの 時とか、勝手に右辺値に変えてくれたりの最適化ってしてくんないのかね。
|
- 【初心者歓迎】C/C++室 Ver.91【環境依存OK】
568 :デフォルトの名無しさん[sage]:2014/07/05(土) 21:47:42.49 ID:Im7i5kcd - もっと11の最適化が進んだら、そのうちmoveはgoto並みの劇薬扱い
されるようになる様子が目に浮かぶわ・・・
|
- 【初心者歓迎】C/C++室 Ver.91【環境依存OK】
571 :デフォルトの名無しさん[sage]:2014/07/05(土) 21:56:53.63 ID:Im7i5kcd - C++11自体が正気じゃない。
|