是否在函数声明中使用Const参数

时间:2017-02-10 22:58:57

标签: c++

我正在学习lippman的Essential C ++。这是我感到困惑的源代码。

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <vector>
#include <list>

template <const typename elemtype>
inline elemtype* begin(const vector<elemtype> &vec) {
    return vec.empty() ? 0 : &vec[0];
}

template <const typename elemtype>
inline elemtype* end(const vector<elemtype> &vec) {
    return vec.empty() ? 0 : &vec[vec.size()];
}

template < typename elemtype>
int* find(const elemtype *first, const elemtype *last, elemtype value) {
    if (!first || !last) {
        return 0;
    }
for (; first != last; ++first) {
    if (*first == value)
        return first;
}
return 0;
}

int main()
{
    int a[] = { 1,1,2,3,5,8,13,21,34 };
    int search_value = 5;
    int *pi = find(a, a + 9, search_value);
    vector<int> svec(a, a + 9);
    int *srch_add;
    srch_add = find(begin(svec), end(svec), search_value);
    cout << *srch_add;
    getchar();
    return 0;
}

这个来自基本c ++的例子实际上在main中调用第二个find函数时出错了。在仔细检查错误可能来自的所有可能方式后,我终于发现错误在于内联函数的const参数 - 开始和结束。它们应该像这样修改:

template <typename elemtype>
inline elemtype* begin(vector<elemtype> &vec) {
    return vec.empty() ? 0 : &vec[0];
}

template <typename elemtype>
inline elemtype* end(vector<elemtype> &vec) {
    return vec.empty() ? 0 : &vec[vec.size()];
}

我解决了这个问题而不理解我为什么要这样做。内联函数返回第一个整数的地址和向量之后的下一个整数。执行内联函数后,&amp; vec已经消失,find函数中的指针应该能够改变指向的地址。为什么这里存在不连续性?

0 个答案:

没有答案