尽管有SFINAE,这个节目是否格局不正确?

Lig*_*ica 2 c++ sfinae language-lawyer

template <typename T> void f() {
    return 0;  // returning value from function returning `void`
}

int main()
{
    // Not instantiating or calling any f<T>()
}
Run Code Online (Sandbox Code Playgroud)

在对这个答案的评论中,David断言包含语义错误但未实例化的函数模板会导致程序格式错误:

无论模板使用或不使用不要紧,程序形成不良甚至没有任何实例,但不是必需的编译器诊断它.

相反,我很确定SFINAE,以及防止类型推导和因此实例化函数模板[C++11: 14.8.2/8],使程序保持良好的形式.但是我在这个标准段落中找不到明确说明的任何文字.

谁是对的?


维基百科,我不认为这个问题具有权威性,说的是一个略有不同的案例:

[..]引入SFINAE是为了避免在不相关的模板声明可见时创建不良程序 [...]

(强调我的)

Dav*_*eas 9

根据14.6/8,该计划格式不正确:

如果能为一个模板定义不会产生有效的专业化,该模板不会被实例化,模板定义形成不良的,没有诊断需要.

那是你是否实例化模板与否,形成不良的模板定义,因为没有可能的实例会成功.

请注意,这与SFINAE完全无关:替换失败不是错误是替换过程的一部分,并且从不考虑模板的内容.