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

时间:2015-01-18 03:56:29

标签: c++ templates

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

从main编译?

编译错误在任何情况下都是&#34;没有匹配函数来调用&#39; binarySearch&#39;。

1 个答案:

答案 0 :(得分:2)

问题是你不能将临时对象绑定到非const引用。

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

如果您将0存储在变量中并使用了non-const version would work

§8.5.4

  

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