当同时存在char,int类型时:
#include <iostream>
#include <string>
#include <cstring>using namespace std;void show(int a)
{cout << "int a" << endl;
}void show(char a)
{cout << "char a" << endl;
}int main()
{// 当两个函数同时存在时:show(97); // 传进去是int就走intshow('a'); // 传进去是char就走charreturn 0;
}
当只存在一个类型时:
#include <iostream>
#include <string>
#include <cstring>using namespace std;// void show(int a)
// {
// cout << "int a" << endl;
// }void show(char a)
{cout << "char a" << endl;
}int main()
{// 当只存在一个函数时:show(97); // 强转 都走charshow('a'); // 传进去是char就走charreturn 0;
}
当同时存在int和引用类型时:
#include <iostream>
#include <string>
#include <cstring>using namespace std;void show(int a)
{cout << "int a" << endl;
}void show(int &a)
{cout << "char a" << endl;
}int main()
{// 当同时存在int和引用类型时:show(97); // 97和'a'都是右值 ,走int ashow('a'); // 97和'a'都是右值 ,走int areturn 0;
}
当同时存在int和引用类型时:
#include <iostream>
#include <string>
#include <cstring>using namespace std;void show(int a)
{cout << "int a" << endl;
}void show(int &a)
{cout << "char a" << endl;
}int main()
{// 当同时存在int和引用类型时:int a = 1;int &b = a;show(a); // 无论传a还是b 编译器均报告有重载歧义show(b); // 无论传a还是b 编译器均报告有重载歧义return 0;
}
但是如果写成如下这样:提示函数重定义
#include <iostream>
#include <string>
#include <cstring>using namespace std;
// 但是如果写成如下这样:提示函数重定义
void show(int a)
{cout << "int a" << endl;
}void show(int a)
{cout << "char a" << endl;
}int main()
{return 0;
}
说明无论是微软的msvc 还是gnu的g++都认为int 与 int & 是不同的类型,构成重载
但是让编译器选择的时候,编译器无法判断,抛出存在重载歧义,同时:
#include <iostream>
#include <string>
#include <cstring>using namespace std;void show(int a)
{cout << "int a" << endl;
}void show(int &a)
{cout << "int &a" << endl;
}int main()
{int a = 10;int &b = a;// 运行时类型识别(RTTI) typeid无法区分引用std::cout << typeid(a).name() << std::endl;std::cout << typeid(b).name() << std::endl;// 静态断言 编译检查 可以区分引用 但无法用其结果进行判断static_assert(is_same<decltype(a), int>::value, "a is not int");static_assert(is_same<decltype(a), int &>::value, "a is not int&");static_assert(is_same<decltype(b), int>::value, "b is not int");static_assert(is_same<decltype(b), int &>::value, "b is not int&");// 结论:show(a); // 编译运行时均有歧义show(b); // 编译运行时均有歧义return 0;
}
番外篇:
传入10,不存在右值引用时,常量引用被匹配
#include <iostream>
#include <string>
#include <cstring>using namespace std;void show(int &a)
{cout << "int a" << endl;
}void show(const int &a)
{cout << "int &a" << endl;
}
// void show(int&& a)
// {
// cout << "int&& a" << endl;
// }
int main()
{// 传入10,不存在右值引用时,常量引用被匹配int a = 10;show(10);return 0;
}
存在右值引用,则优先匹配右值引用:
#include <iostream>
#include <string>
#include <cstring>using namespace std;void show(int &a)
{cout << "int a" << endl;
}void show(const int &a)
{cout << "int &a" << endl;
}
void show(int &&a)
{cout << "int&& a" << endl;
}
int main()
{// 传入10,存在右值引用时,优先匹配右值引用int a = 10;show(10);return 0;
}