模板函数和const/non-const引用参数

3

我刚开始学习C++,并从书籍中学习,因此我的推理可能会很迂腐或者狭隘。

就模板函数而言,我了解到当参数通过引用传递时,只允许从非const的引用/指针转换为const的引用/指针。

这意味着我相信:

template <typename T> int compare(T&, T&);  

当调用compare(ci1, ci1)时应该失败,其中ci1为常量int,因为不允许将Const转换为非Const以用于引用参数。

然而,在我的编译器(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个回答

3
调用
compare( ci1, ci1 );

const int作为类型产生T(采用您偏爱的符号表示法)。

有效函数签名如下:

int compare( int const&, int const& )

你可以使用 typeid(x).name() 来检查你实际拥有的类型。

注意:在g++中,这会产生一些难以理解的简写形式,然后你需要使用特殊的g++-特定运行时库函数来解码。

祝好运。


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

在第一种情况下,模板被实例化为T = const int,这是可以的。

如果您尝试使用compare(i1, ci1),则会出现错误,因为它无法找到与int&const int&兼容的模板参数。将签名更改为compare(const T&, const T&)将解决该问题。


1

在 compare(ci1, ci1) 的情况下,T 将是 const int。这就是为什么它能够正常工作的原因。


1

这是可以接受的,因为当您用int const替换T时,函数可以被实例化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接