Effective Modern C++読書会 vol.2 ================================ - 場所:フェンリル株式会社 - 日時:2015/12/14 19:30~21:00 - http://cpp-osaka.connpass.com/event/23940/ 項目2 ----- * なんで初期化の統一記法が追加された? | 主にvectorの初期化をどうにかするために導入された。 | push_backをどうにかするため。 | std::arrayの初期化には使えない。 .. 正誤表、なぜこうしたの? 都合が悪かった * 変数x5は型変換しない 数値ならいいかもしれないけどユーザー定義のものが暗黙のうちに変換されるとイヤなことしかないから全て変換させない。 x5はこんな形でもコンパイルを通させることもできる :: hoge x = {1, 2.0, "abc"}; // 引数3つのコンストラクタ ↓にするとどんなものも通っちゃう :: template(typename ... Ts> hoge(Ts ... xs) { ... } auto x = hoge{1,2,3} :: int hoge(fuga(x)); とか書くと関数宣言とみなされてしまう。 :: int hoge{fuga(x)}; と書くと回避できる。波かっこの活躍するケース! * p.16、createInitList()の返り型がinitializer_listならコンパイルが通る。 .. 変数宣言の時だけ initializer_listとかではダメ。 * テンプレートでは型の情報がないと何も推論してくれない 項目3 ----- * decltypeとは | これまでの推論では参照性が外れていたが、参照が外れなくなる? | →名前に関してはそう。式に関しても概ねそう。 :: decltype(b) a; // bと同じ型 decltype(f(b)) a; // fの返値 decltype((b)) a; // (b)は式なのでlvalue int && b = ...; decltype(b);// rvalue decltype((b));// lvalue .. 19ページのプログラム文は何が間違っている? そのものの型ではない 戻り値 c[i]が参照であってもコピーになってしまう。 "decltype(auto)"という一つのキーワードとして考えればいい。識別子になる 良くある使い方→型を右から左に受け流す場合。 .. 型はrvalueでも式はlvalueとなる std::forward(p.21周辺) | cがrvalueの変数として定義されている場合はrvalueとして扱われ、 | cがlvalueの変数として定義されている場合はlvalueとして扱う。 std::forward使わないと cがrvalueを受けていてもc自体はlvalue返る型はlvalueとなってしまう :: // オーバーロードで適切な方が呼ばれる abc&& f(hoge) &&; // rvalueを受けてrvalueを返す 勝手にmoveが走るようになる abc& f(hoge) &; // lvalue 次回 p.22後半から