Perfect Forwarding の弊害

2
普通のC++使い、銀天すばる @SubaruG

問。C++0xにおけるconst教(ローカル変数をはじめとした全ての変数に対し、値を変更しない場合にはconstを付ける習慣)の弊害を述べよ。

2011-01-17 00:45:33
普通のC++使い、銀天すばる @SubaruG

その弊害に対し行える妥当な対処を、ライブラリ上および言語コアのそれぞれの観点から、完結に記せ。(20点)

2011-01-17 00:49:25
普通のC++使い、銀天すばる @SubaruG

標準に movable<T> とか欲しいんだよにゃ。基本 T const として扱えて、 move するときだけ破壊的変更が可能な型。

2011-01-17 00:57:32
普通のC++使い、銀天すばる @SubaruG

日記書いた: C++0x 標準ライブラリ完全解説 ~ No.02 std::move, <utility> http://d.hatena.ne.jp/gintenlabo/20110116/1295195945

2011-01-17 02:13:50
普通のC++使い、銀天すばる @SubaruG

結局、超初心者向け解説に。 && が一度も登場しない rvalue reference 解説記事って地味に史上初じゃなイカ?

2011-01-17 02:15:13
普通のC++使い、銀天すばる @SubaruG

もちろん、僕も積極的に増やすよ?

2011-01-17 02:25:05
普通のC++使い、銀天すばる @SubaruG

C++ の関数における引数の型は、引数を書き換えない場合には T const& を、引数経由で値を戻したい場合は T& を、引数を書き換えたいけど引数経由で値を戻したくない場合には T を、それぞれ使うのが良い。

2011-01-17 02:32:07
普通のC++使い、銀天すばる @SubaruG

move ctor/move assign あるいは Perfect Forwarding 以外の場面で、 T&& を引数とした関数を定義することは、まず無い。

2011-01-17 02:33:07
普通のC++使い、銀天すばる @SubaruG

move ctor/move assign あるいは Perfect Forwarding 以外の場面で、 T&& を引数とした関数を定義することは、まず無い。

2011-01-17 02:33:07
普通のC++使い、銀天すばる @SubaruG

そして move ctor/move assign は、よっぽどのことがない限り、コンパイラによって自動生成されたものをそのまま使うほうが、間違いがなくて良い。結果として、 T&& を引数に取る関数が、ユーザコードに現れるようなことは、滅多に無い。

2011-01-17 02:36:11
普通のC++使い、銀天すばる @SubaruG

Perfect Forwarding は、ユーザコードに書くには色々と問題がありまして。

2011-01-17 02:37:32
普通のC++使い、銀天すばる @SubaruG

邪悪なる ADL 先生の餌食になりやすいという。

2011-01-17 02:37:52
普通のC++使い、銀天すばる @SubaruG

Perfect Forwarding の弊害: 関数呼び出し f(x); の候補として、 template<class T> void f( T&& ); という関数と、 class X; void f( X const& ); という関数が見つかったとする。

2011-01-17 02:39:49
普通のC++使い、銀天すばる @SubaruG

ここで、もし f(x); の x が、 X x; って宣言された変数 x だった場合、後者の void f( X const& ); ではなく、前者の template<class T> void f( T&& ); が呼ばれます。

2011-01-17 02:40:59
普通のC++使い、銀天すばる @SubaruG

コード: http://ideone.com/bNxIG これが ADL と組み合わさると、コンパイルエラーにならないまま妙な動作を行う事になり、非常に危険。

2011-01-17 02:43:24
普通のC++使い、銀天すばる @SubaruG

Perfect Forwarding を使う際は、これらの危険を把握した上で使いましょう。 C++ 氏ねこかわいい。

2011-01-17 02:46:19
普通のC++使い、銀天すばる @SubaruG

僕も「C++0x の新機能によってユーザが受ける恩恵」的な記事を書こうかしら。

2011-01-17 03:10:45
普通のC++使い、銀天すばる @SubaruG

まあ、今日書いた move の記事も、そういう側面はあるけど。

2011-01-17 03:12:59
普通のC++使い、銀天すばる @SubaruG

C++0x で一番好きなのは、やっぱ std::unique_ptr さんかなぁ。

2011-01-17 03:17:09
普通のC++使い、銀天すばる @SubaruG

これと implicit move の組み合わせは、バグを劇的に減らしてくれる。

2011-01-17 03:19:30
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

Implicit Move って結局 Must Go されなかったんだっけ。

2011-01-17 03:21:51
普通のC++使い、銀天すばる @SubaruG

@bolero_MURAKAMI ユーザ定義のデストラクタがある場合には自動生成されません。あと、これは元からですが、コピーコンストラクタとコピー代入演算子がある場合もです。

2011-01-17 03:23:43
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

@SubaruG どうもです。ユーザ定義デストラクタがある場合のデフォルトコピーコンストラクタは deprecated になったそうですが、合わせる形に落ちついたんですね。

2011-01-17 03:26:09