template <typename T> void f() {
return 0; // returning value from function returning `void`
}
int main()
{
// Not instantiating or calling any f<T>()
}
この回答へのコメントで、Davidは、セマンティックエラーを含み、インスタンス化されていない関数テンプレートがプログラムの形式を正しくしないと主張しています。
テンプレートが使用されているかどうかは関係ありません。インスタンス化されていなくてもプログラムの形式は正しくありませんが、コンパイラはそれを診断する必要はありません。
逆に、SFINAEは、型の推定を防ぎ、したがって、ごとの関数テンプレートのインスタンス化を防ぐだけでなく[C++11: 14.8.2/8]
、プログラムが整形式であり続けることを可能にすることを確信しています。ただし、この標準段落には、明示的にそのように記載されているテキストは見つかりません。
誰が正しいですか?
ウィキペディアは、この質問に対して権威があるとは見なしませんが、わずかに異なるケースについて述べています。
[..] SFINAEは、無関係なテンプレート宣言が表示されたときに不正な形式のプログラムを作成しないようにするために導入されました[..]
(強調鉱山)