C++標準[temp.over.link]では、関数テンプレートの等価性の決定にコンパイラの "ヒーロー的な努力"は含まれてはならないと説明されています。テンプレートの同等性またはテンプレートの機能的同等性?
例として、C++標準では、このことを提案する:
// guaranteed to be the same
template <int I> void f(A<I>, A<I+10>);
template <int I> void f(A<I>, A<I+10>);
// guaranteed to be different
template <int I> void f(A<I>, A<I+10>);
template <int I> void f(A<I>, A<I+11>);
// ill-formed, no diagnostic required
template <int I> void f(A<I>, A<I+10>);
template <int I> void f(A<I>, A<I+1+2+3+4>);
は、このルールはまた、以下の例のように、メタプログラミングを含む場合にも適用されますか?
template<class T>
struct t_{
using type = T;
};
//ill-formed or different?
template<class T> T f(T);
template<class T> typename t_<T>::type f(T);
"id_t"がtypdef(iostreamを含める必要がある)のためにHaha、clang、およびgccがクラッシュする – AndyG
実際には異なる宣言をすることが可能であることについて最後に良い点があります。このシナリオでは、結果の関数呼び出しの試行があいまいではないような特殊化を構成することも可能ですか? – AndyG
@AndyGこれは、これは、あなたの答えの最後のコメントに投稿した質問です。 'id'は特殊化できるので、 'T'と' id 'は同等ではありません。彼は本当に強いです! –
Oliv