Skip to content
Go back

C++:CTADの仕組み

· Updated:
  • 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> SS<int>{x, y}Uのみを推論させられない
      • <>を付けたら推論は行われない
  • CTADは変換よりコピーを優先する
    • より特殊化された候補を優先して選択するため、S(T)→S<T>S(S<T>) → S<T>があるとき、S{S{}}は後者を選択する
    • 同率のものが複数ある場合:
      • ユーザー定義のガイドが暗黙的に生成されるガイドより優先される
      • 暗黙的に定義されるガイドの中では、S(S<T>) → S<T>がまず優先され、次に、非テンプレートのものがテンプレートのものより優先される
  • CTADを意図しないときは、type_identityなどで抑制できる
  • クラステンプレート内では、見た目同じでも扱いが異なる
    • テンプレート名が実際のクラス名として扱われるので、推論させたくてもできない

参考文献#