模板函数和Const / NonConst参考参数

时间:2011-04-04 11:01:39

标签: c++ templates function parameters reference

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);  

5 个答案:

答案 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时,可以实例化该函数。