C++20 コア言語機能読書会vol.16
開催日時
2022年10月19日(水) 21:00~22:30
開催URL
参加人数
3人
ウォーミングアップ
4.5 エイリアステンプレートのCTAD
エイリアステンプレートを経由するとクラステンプレートのテンプレート引数推論は無効になっていたがC++20で有効になった
推論補助は書けない
4.6 explicit(bool)
テンプレートパラメータがexplicitであるかどうかで2つのコンストラクタを切り替えるとき
今まではSFINAEで実現していた
C++20からはexplicit(hoge)でhogeの真偽によってそのコンストラクタのexplicit性が変化するようになった
std::is_convertible
型Fromから型Toに、暗黙的に変換可能か調べる
5. ラムダ式
5.1 ジェネリックラムダのテンプレート構文
ラムダ式の型は今までautoで書いていたが、通常のテンプレートと同じような書き方ができるようになった
auto f1 = []<typename T>(const T& vector) {};
5.2 [=, this] とthis の暗黙キャプチャの非推奨化
thisの値キャプチャというより*thisのコピーした値キャプチャ
thisポインタが暗黙的にコピーキャプチャされて実質的に参照キャプチャになりうるケースがあるので、明示的にthisを書かせるようにした
5.3 ステートレスラムダのクロージャ型のデフォルトコンストラクタと代入演算子の定義
次回ここから
お悩み雑談室
ラムダ式でmoveキャプチャしたキャプチャ変数をさらにmoveさせようとするとコンパイルエラーになって原因を調べていた
キャプチャした変数は暗黙的にconstがついているのが原因だった
ラムダ式にmutableを付ければコンパイルは通った
code:cpp
void test()
{
std::vector<std::unique_ptr<int>> vecSource;
std::vector<std::unique_ptr<int>> vecDest;
mutable
{
vecDest = std::move(vecTemp); // mutableなしだとエラー
// const_castで無理やりconstを外してもコンパイルは通った
//auto& tmp = const_cast<std::vector<std::unique_ptr<int>>&>(vecTemp);
//vecDest = std::move(tmp);
};
vecDest = std::move(vecSource);
}
なんも知らずにC++書いてるな…