サーチ…


備考

  • 同じ名前、同じタイプであっても、通常の関数は決して関数テンプレートに関連しません。
  • 通常の関数呼び出しと生成された関数テンプレート呼び出しは、同じ名前、同じ戻り型、同じ引数リストを共有していても異なっています

有効な関数テンプレートのオーバーロードは何ですか?

関数テンプレートは、テンプレート以外の関数のオーバーロード(同じ名前だが異なるパラメータタイプ)のルールでオーバーロードすることができ、それに加えて、オーバーロードはif

  • 戻り値の型が異なるか、または
  • テンプレートのパラメータリストは、パラメータの命名とデフォルト引数の存在を除いて異なります(署名の一部ではありません)

通常の関数では、2つのパラメータ型を比較す​​るのはコンパイラにとって簡単です。なぜなら、すべてのinformatを持っているからです。しかし、テンプレート内の型はまだ決定されていないかもしれません。したがって、2つのパラメータ型が等しい場合のルールは近似的であり、非デプエンドエンド型と値が一致する必要があり、従属型と式のスペルが同じである必要がある(より正確には、いわゆるODRルール)、ただしテンプレートパラメータの名前を変更することができます。ただし、このような異なるスペルの下では、型内の2つの値が異なるとみなされますが、常に同じ値にインスタンス化されます。オーバーロードは無効ですが、コンパイラからの診断は必要ありません。

template<typename T>
void f(T*) { }

template<typename T>
void f(T) { }

"T"と "T *"は異なる綴りなので、これは有効なオーバーロードです。しかし、以下は無効であり、診断は必要ありません

template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }

template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow