- Class-Template Argument Deduction; CTADは「Deduction Guidesに対するTemplate Argument Deductionによって推論された型でテンプレート引数を置換する」ようなもの
- ガイドと同じインターフェイスを持つ関数に対して、オーバーロードを解決し、テンプレート実引数を推定することで、クラステンプレートの実引数を決定する
- Deduction Guideは「その引数を受け、そのクラスインスタンスを返す、CTAD専用の関数」のようなもの
- コンストラクタと同じものが暗黙的に定義されるし、ユーザーが明示的に定義することもできる
- 実は、ガイドはテンプレートでなくても問題なく定義できる
- “のようなもの”なので、CTADはTADに無い特徴もある:
- 参照のforwardingを起こさない
S(T&&) → S<T>はrvalueのみ受け付けるので、T = int&にならない
- テンプレート引数を部分的に指定できない
template <typename T, typename U> SをS<int>{x, y}でUのみを推論させられない<>を付けたら推論は行われない
- 参照のforwardingを起こさない
- CTADは変換よりコピーを優先する
- より特殊化された候補を優先して選択するため、
S(T)→S<T>とS(S<T>) → S<T>があるとき、S{S{}}は後者を選択する - 同率のものが複数ある場合:
- ユーザー定義のガイドが暗黙的に生成されるガイドより優先される
- 暗黙的に定義されるガイドの中では、
S(S<T>) → S<T>がまず優先され、次に、非テンプレートのものがテンプレートのものより優先される
- より特殊化された候補を優先して選択するため、
- CTADを意図しないときは、
type_identityなどで抑制できる - クラステンプレート内では、見た目同じでも扱いが異なる
- テンプレート名が実際のクラス名として扱われるので、推論させたくてもできない
C++:CTADの仕組み
·
Updated:
Share this post on: