c++ - 模板函数和 Const/NonConst 引用参数

标签 c++ templates function parameters reference

C++ 新手和从书本上学习,所以我可以在推理时非常迂腐或目光短浅。

在模板函数的情况下,我读到当参数通过引用传递时,只允许从引用/指针到非 Const 到引用/指针到 Const 的转换。

这意味着我相信

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

当调用 compare(ci1, ci1) 时应该会失败,ci1 是 constant int,因为引用参数不允许从 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);  

最佳答案

电话

compare( ci1, ci1 );

产生 const int 类型的 T(以您喜欢的表示法)。

有效的函数签名是

int compare( int const&, int const& )

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

注意:使用 g++ 会产生一些无法理解的短格式,然后您需要使用特定于 g++ 的特殊运行时库函数对其进行解码。

干杯。

关于c++ - 模板函数和 Const/NonConst 引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5537533/

相关文章:

c# - 是否有用于解析字符串以创建 C# 函数的工具?

javascript - 如何编写一个 javascript 函数来检查字符串中的第一个字符和最后一个字符是否相等

c++ - array<array<int, M>, N> 的列表初始化

c++ - 我的程序被 avast 防病毒软件阻止

c++ - 错误的模板参数数量(3,应该是 4)

c++ - 尝试编译 MixKit 库时出错 (C++)

c++ - 使用 static_assert 确保模板参数只*最多*一次使用

c++ - 计算矩阵的秩

c++ - 解决方法 clang 警告 -Wambiguous-member-template

java - EMV TLV Java 函数