为什么模板函数只基于返回类型才能在C++上运行?

sfz*_*sfz 8 c++ templates

据我所知,重载函数必须包含不同的参数(类型或计数).所以我认为模板函数不应该只基于返回类型.但是以下代码可以使用GCC 6.3.0.

#include <iostream>
using namespace std;

template<typename T>
T add(double a, double b)
{
    return static_cast<T>(a + b); 
}

int main()
{
    cout << add<int>(1.1, 1) << endl;
    cout << add<double>(1.1, 1) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

构建并运行:

g++ -g -o test test.cpp
./test
2
2.1
Run Code Online (Sandbox Code Playgroud)

剂量C++标准澄清了这一点?谢谢!

Sto*_*ica 12

不能仅基于返回类型重载的原因是返回类型不是函数签名的一部分,与参数类型不同.不要相信我的话,C++标准同样说:

[defns.signature]

⟨function⟩name,parameter-type-list和封闭命名空间(如果有的话)

[注意:签名用作名称修改和链接的基础. - 结束说明]

但对于函数模板,被他们产生或明或暗地,签名包含参数(S):

[defns.signature.spec]

⟨functiontemplatespecialization⟩模板的签名,它是一个特化及其模板参数(无论是明确指定还是推导)

因此add<int>,它int成为签名的一部分.不是因为它是返回类型,而是因为它是模板参数.同样的add<double>.只要签名不同,那些可以被识别为不同的功能,因此可能在同一名称上重载.