C ++重载函数和函数模板-不同的行为?

贫民窟

我有以下代码:

void A(const int*)
{
    cout << "const int*" << endl;
}

void A(const int&)
{
    cout << "const int&" << endl;
}

template <typename T>
void B(const T*)
{
    cout << "const T*" << endl;
}

template <typename T>
void B(const T&)
{
    cout << "const T&" << endl;
}

int main()
{
    int* a = nullptr;
    A(a);            //output: const int*

    int* b = nullptr;
    B(b);            //output: const T&

    return 0;
}

A(a)正在调用该函数A(const int*)
B(b)正在调用模板函数B(const T&)

由于重载解析的工作方式,我对模板的行为并不感到惊讶。但是我无法解释为什么非模板函数返回相反的结果(这更直观)。

是因为使用非模板函数不需要推导类型并且将其视为完全匹配(允许添加const-ness吗?)?

我不是元编程和编译器正在做的事情(例如重载解析)的专家,这就是为什么我有点困惑的原因。

本杰明·林德利(Benjamin Lindley)

在对非模板的调用中,您正在传递一个指向int的指针。那么如何调用期望引用int的函数呢?两者是完全不同的类型。是的,允许添加const。如果您在constness上超载,请执行以下操作:

void A(const int*)
{
    cout << "const int*" << endl;
}

void A(int*)
{
    cout << "int*" << endl;
}

非const版本将被选为更好的匹配。

使用模板,情况有所不同。请记住,指针也是类型。推断T与指针类型一样有效当您调用时B(b),编译器可以使用以下函数:

template <typename T>
void B(const T*)
{
    cout << "const T*" << endl;
}

在这种情况下,T必须推导为int,并const T*成为const int*const int的指针。

或者编译器可以选择此函数:

template <typename T>
void B(const T&)
{
    cout << "const T&" << endl;
}

在这种情况下T,推导为int*const T&就变成了int* const&,那就是,一个const指针指向int的参考。

由于在第二种情况下,它T精确地映射到您实际传入的内容(一个指向int的指针),因此它是更好的匹配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++重载函数和函数模板-不同的行为?

来自分类Dev

C ++:可变参数模板和函数重载

来自分类Dev

模板参数上的C ++函数模板重载

来自分类Dev

g ++是否行为不当而导致函数模板重载?

来自分类Dev

函数模板重载(不同的返回值类型)

来自分类Dev

C ++函数模板重载:空括号与显式int

来自分类Dev

C ++ gcc函数模板重载编译器问题

来自分类Dev

C ++模板函数的重载

来自分类Dev

模板函数重载C ++

来自分类Dev

具有enable_if的C ++模板重载:g ++和clang的不同行为

来自分类Dev

C ++函数模板格式

来自分类Dev

函数模板的C ++ Decltype

来自分类Dev

C代码作为主函数的行为与主函数不同

来自分类Dev

C ++模板函数重载解析

来自分类Dev

C ++中的模板函数重载

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

C ++中的模板专业化和函数重载

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

使用默认参数的C ++函数模板

来自分类Dev

重载函数模板和继承的参数

来自分类Dev

有和没有主体的C ++部分构造函数的行为都不同

来自分类Dev

使用不同的枚举参数时,VC ++函数模板实例化错误C2664

来自分类Dev

C ++函数模板特化声明和模板参数;无vs。<> vs. <类型>

来自分类Dev

模板重载的行为与非模板重载的行为不同

来自分类Dev

具有依赖类型的c ++ 11可变函数模板重载是否模棱两可?

来自分类Dev

为什么gcc和clang为函数模板的实例化生成不同的符号名称?

来自分类Dev

MKL库在mex文件和独立C ++中的行为不同

来自分类Dev

基类C#和Java不同的行为

来自分类Dev

MKL文件在MEX文件和独立C ++中的行为不同

Related 相关文章

热门标签

归档