C ++的新手,从书本中学习,所以在我的推理中,我可能会非常迂腐或蠢。
在模板函数的情况下,我已经读过,当参数通过Reference传递时,只有从Reference / Pointer到NonConst到Reference / Pointer to Const的转换才会被转换。
这意味着我相信
template <typename T> int compare(T&, T&);
调用compare(ci1,ci1)时,应该失败,ci1为consntant int,因为Reference参数不允许从Const转换为NonCost。
但是它适用于我的编译器(Visual C ++ 10)。有人能解释我的错误吗?
template <typename T> int compare(T&, T&);
template <typename T> int compare(T &v1, T &v2)
{
// as before
cout << "compare(T, T)" << endl;
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
const int ci1 = 10;
const int ci2 = 20;
int i1 = 10;
int i2 = 20;
compare(ci1, ci1);
compare(i1, i1);
答案 0 :(得分:3)
电话
compare( ci1, ci1 );
将T作为const int
类型(以您的首选符号表示)。
然后是有效的功能签名
int compare( int const&, int const& )
您可以使用typeid(x).name()
检查您实际拥有的类型。
注意:使用g ++生成一些不可编辑的短格式,然后您需要使用特殊的g ++特定运行时lib函数进行解码。
干杯&amp;第h
答案 1 :(得分:2)
T
将是变量的任何类型 - 在您的情况下为const int
,因此compare
的最终实例化将如下所示
// T = const int
int compare(const int& v1, const int& v2)
在你的第一个案例compare(ci1,ci2)
和
// T = int
int compare(int& v1, int& v2)
compare(i1,i2)
。
答案 2 :(得分:2)
在第一种情况下,模板使用T = const int
进行实例化,这很好。
如果您尝试compare(i1, ci1)
,则会收到错误,因为无法找到与int &
和const int &
兼容的模板参数。将签名更改为compare(const T &, const T &)
将解决该问题。
答案 3 :(得分:1)
在比较的情况下(ci1,ci1); T将是const int。这就是它工作的原因
答案 4 :(得分:1)
这是可以接受的,因为当您将int const
替换为T
时,可以实例化该函数。