我有可能是一个愚蠢的问题,但我只是不理解我的书对它的解释.
它说"当编译器看到模板的定义时,它不会生成代码.它只在我们实例化模板的特定实例时生成代码.事实上代码只在我们使用模板时生成(而不是在我们使用模板时生成定义它)影响我们组织源代码的方式以及何时检测到错误...要生成实例化,编译器需要具有定义函数模板或类模板成员函数的代码.因此,与非模板代码不同,模板的标题通常包括定义和声明."
"生成代码"究竟是什么意思?我想我从来没有真正考虑过编译器发生了什么,并且对它没有太多了解,所以当你编译模板函数或类与非模板函数或类相比时,我不理解它们有什么不同
众所周知,仅返回类型不同的普通函数不能在 C++ 中重载。
但这个限制不适用于重载的函数模板,例如:
int f(auto) { return 1; }
auto f(auto) { return 2; }
Run Code Online (Sandbox Code Playgroud)
所有编译器都接受它,演示: https: //gcc.godbolt.org/z/qj73Mzehd
为什么该语言对模板做出这样的例外?
如果重载函数的返回类型不同,则可以使用强制转换为预期函数类型来选择其中一个函数。令人惊讶的是,即使返回类型实际上相同,Clang 也允许解决歧义,例如:
((int(*)(int))f)(3);
Run Code Online (Sandbox Code Playgroud)
选择
int f(auto) { return 1; }
Run Code Online (Sandbox Code Playgroud)
演示: https: //gcc.godbolt.org/z/snfvbq1ME
Clang这里错了吗?