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<int>ならコンパイルが通る。
initializer_list<T>とかではダメ。
テンプレートでは型の情報がないと何も推論してくれない
項目3¶
- decltypeとは
- これまでの推論では参照性が外れていたが、参照が外れなくなる?→名前に関してはそう。式に関しても概ねそう。
decltype(b) a; // bと同じ型
decltype(f(b)) a; // fの返値
decltype((b)) a; // (b)は式なのでlvalue
int && b = ...;
decltype(b);// rvalue
decltype((b));// lvalue
- “decltype(auto)”という一つのキーワードとして考えればいい。識別子になる
- 良くある使い方→型を右から左に受け流す場合。
- 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後半から