具有不同返回类型的模板实例



根据这份文件,它说[强调我的]:

函数的返回类型对函数重载没有影响 ,因此不会重载具有不同返回类型的相同函数签名。示例:如果有两个函数:int sum()和float sum(),这两个函数将生成编译时错误,因为这里不允许函数重载。

令人惊讶的是,这个代码片段工作!

#include <type_traits>
#include <iostream>
template <typename T>
T foo(){return T{};}
template<>
int foo(){std::cout << "int" << std::endl; return int{};}
template<>
double foo(){std::cout << "double" << std::endl; return double{};}
int main() {
    foo<int>();
    foo<double>();
    foo<bool>();
}

你看,下面的代码片段确实不能编译(如果你有问题,请参阅文章开头的引语):

#include <type_traits>
#include <iostream>
int foo(){std::cout << "int" << std::endl; return int{};}
double foo(){std::cout << "double" << std::endl; return double{};}
int main() {
}

在第一个代码片段中,您提供了两个专门化primary功能模板foo<T>。特别是,您已经为T=intT=double提供了专门化,这意味着我们将拥有彼此不同的foo<int>foo<double>

所以在第一个代码片段中没有函数重载,因为名字一开始就不一样。一个是foo<int>,一个是foo<double>

From function overload 11.3.5.5

A 单名可用于单个作用域内的多个不同功能;这是函数重载。

更重要的是,注意特殊化实例化一个模板;不重载。因此,专门化不会影响函数匹配.

考虑下面的例子来说明这一点:

示例1

template <typename T>
T foo(T a, T b){return T{};}
template <>
int foo(int a, int b){return 4;}
int main()
{
    foo(5, 7.0); // error: no matching function for call to ‘foo(int, double)’ 
}
示例2

template <typename T>
T foo(T a, T b){return T{};}
int foo(int a, int b){return 4;}
int main()
{
    foo(5, 7.0); // works fine 
}

另一方面,在第二个代码片段中,由于函数名相同,因此它是函数重载,我们不能只在返回类型上重载普通函数。

来自可重载声明

不能重载仅在返回类型、异常说明或两者不同的函数声明。

相关内容

最新更新