为什么我必须声明这些引用参数常量或按值传递


#include <vector>
#include <iostream>
using namespace std;
static const int NOT_FOUND = -1;
template <class sequence, class T>
int binarySearch(sequence& seq, int low, int high, T& item)
{
    //..
}
template <class sequence, class T>
int binarySearch(const sequence& seq, const T& item)
{
    if (seq.size() == 0)
        return NOT_FOUND;
    return binarySearch(seq, 0, seq.size() - 1, item);
}
int main()
{
    vector<int> t1 = {0, 3 ,45, 94};
    cout << binarySearch(t1, 0);
    //binarySearch(t1, 0, t1.size() - 1, 45);
    return 0;
}

为什么编译器不接受:

template <class sequence, class T>
int binarySearch(sequence& seq, T& item)

此外,为什么程序如前所述编译,但调用

binarySearch(t1, 0, t1.size() - 1, 45);

从主要不编译?

在任何情况下,编译器错误都是"没有用于调用'binarySearch'的匹配函数。

问题是您无法将临时对象绑定到非常量引用。

binarySearch(t1, 0);
                 ^---- this is a temporary

如果您将0存储在变量中并使用它,则非常量版本将起作用。

§ 8.5.4

— 否则,如果 T 是引用类型,

则 T 引用的类型临时的 prvalue 是 copy-list-initialized 或 direct-list-initialized,具体取决于引用的初始化类型,并且引用绑定到该临时类型。[ 注意:像往常一样,如果引用类型是对非 const 类型的左值引用,则绑定将失败,并且程序格式不正确。 - 尾注

最新更新