2
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は、無関係なテンプレート宣言が表示されたときに不正な形式のプログラムを作成しないようにするために導入されました[..]

(強調鉱山)

4

2 に答える 2

9

プログラムは14.6/8のように不正な形式です。

テンプレート定義に対して有効な特殊化を生成できず、そのテンプレートがインスタンス化されていない場合、テンプレート定義の形式が正しくないため、診断は必要ありません。

つまり、テンプレートをインスタンス化するかどうかに関係なく、成功する可能性のあるインスタンス化がないため、テンプレート定義の形式が正しくありません。

これはSFINAEとはまったく関係がないことに注意してください。置換の失敗はエラーではありません。置換プロセスの一部であり、テンプレートの内容が考慮されることはありません。

于 2012-11-06T18:39:58.920 に答える
1

もっと詳しく読むと、その標準的な一節は次のように述べています。

置換によって無効な型または式が生成された場合、型の推定は失敗します。無効な型または式は、置換された引数を使用して記述された場合に不正な形式になるものです。[..]

return 0は式ではないため、SFINAEは適用されません。

通路は続きます:

関数型とそのテンプレートパラメータ型の直接のコンテキストで無効な型と式のみが、推定の失敗につながる可能性があります。

return 0関数型またはそのテンプレートパラメータ型とは何の関係もないため、SFINAEはまだ適用されません。

于 2012-11-06T18:34:19.343 に答える