c++ - 为什么从 void 函数模板返回时没有出现编译器错误?

标签 c++ templates

考虑:

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 的 return 语句可能是非法的,但上面的代码将通过。

最佳答案

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

这通常是一件好事,因为代码可以很好地处理一种模板参数,但无法编译另一种模板参数。如果你有模板重载,编译器甚至会忽略编译失败的候选者,参见 SFINAE .

关于c++ - 为什么从 void 函数模板返回时没有出现编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13255826/

相关文章:

c++ - 如何打印其中包含整数的字符串 C++

C++ 模板实例 : using enable_if directly, 或带有辅助类

c++ - 在特定情况下使用 C++ 模板将整数映射到类型失败

asp.net - 中央 HTML 模板可防止 ASP.NET MVC 中出现重复的演示代码

c++ - Google测试-生成用于模板类实例化的值

c++ - C++ ABI 是否指定 vTable 和 RTTI 信息应该如何存在?

c++ - VisualAssist 找不到 boost::bind 的声明

c++ - 在运行时创建相关类型的最佳方法是什么?

c++ - qt打开一个带有不支持警告图像格式的jpg文件

c++ - 为什么我必须通过this指针访问模板基类成员?