繁体   English   中英

为什么不从void函数模板返回编译器错误?

[英]Why don't I get compiler errors from returning from a void function template?

考虑:

void f() {
    return 5;
}

以上会引起错误。 但为什么不呢?:

template <typename = void> void f() {
    return 0;
}

我正在使用gcc-4.5.1进行编译。 为什么使用模板会产生差异,以至于我不会因为非模板函数执行相同的非法返回语句而收到错误? 我得到的唯一挫折是我无法调用函数(即f() )而不得:

error: return-statement with a value, in function returning 'void'

但是,我能够为void函数模板定义return语句的原因是什么?

这是我的代码:

template <typename = void> void f() {
    return 0;
}

// pass

int main() {



}

尽管在返回void的函数中有一个非法的返回语句,上面的代码仍将通过。

大多数检查仅在您实例化模板时完成。

这通常是一件好事,因为代码可以使用一种模板参数正常工作,但无法使用另一种模板参数进行编译。 如果您有模板重载,编译器甚至会忽略无法编译的候选项,请参阅SFINAE

这样做

template <typename = void> void f() {
    return 0;
}

int main()
{
    f<int>();
}

prog.cpp:在函数'void f()[with = int]'中:
prog.cpp:7:12:从这里实例化
prog.cpp:2:12:错误:带有值的return语句,函数返回'void'

虽然程序仍然格式不正确 ,但编译器选择不诊断语义错误(这是它的特权)因为你实际上从未实际实例化该函数。

这是一个实施质量问题。 标准的特别引用是:

14.6 / 8 [...]如果无法为模板定义生成有效的专业化,并且未实例化该模板,则模板定义格式错误,无需诊断。 [...]

也就是说,您的程序生成错误,因为该模板不能用于生成任何有效的特化 ,但编译器不需要诊断它。 当您稍后实例化模板时,编译器必须生成特化,专业化无效并且编译器会抱怨。

您不会在模板定义中出现错误,因为编译器遵循无诊断所需的路径,即忽略问题,直到它在实例化中不再忽略它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM