为什么“int * find(const vector <int>&amp; vec,int value)”给出了无效的转换错误?</int>

时间:2013-06-13 16:05:14

标签: c++ compiler-construction const

我是C ++的新手,并试图在“Essential C ++”一书中使用一些例子。当我从书中写下这段代码时:

int *find(const vector<int> &vec, int value) { ... }

g ++编译器给我一个错误:

error: invalid conversion from 'const int*' to 'int *' [-fpermissive]

我尝试将其更改为

const int *find(const vector<int> &vec, int value)

它工作正常。

所以我只是想知道这有什么详细的原因吗?谢谢!

以下是本书的代码:

int* find(const vector<int> &vec, int value) {
    for(int ix = 0; ix < vec.size(); ++ix)
    {
        if(vec[ix] == value) 
        return &vec[ix];
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

我猜你正在做像

这样的事情
int *find(const vector<int> &vec, int value) 
{ 
  ... 
  return &vec[someIndex];
}

您不能这样做,因为您正在向矢量传递const引用。因此需要返回const int*

你真正应该做的是使用std::find

vector<int>::const_iterator i = std::find(vec.begin(), vec.end(), value);

// check if an element was found and print it out
if (i != vec.end()) std::cout << *i << std::endl;

这具有额外的优点,即当在向量中找不到值时,它不会产生未定义的行为。

答案 1 :(得分:0)

find()返回的值很可能是const,但您的函数定义指定返回类型不是const

您无法将非const变量更改为const

const int*是指向不可更改的int的指针。由于函数返回int*,处理该函数返回值的代码将能够更改指向的整数的值。如果您尝试返回const int*类型的内容,那么这将允许您更改不可更改的整数 - 因此来自编译器的抱怨。