为什么"int *find(const vector<int> &vec, int value)"会给我一个无效的转换错误?

Why does "int *find(const vector<int> &vec, int value)" gives me a invalid conversion error?

本文关键字:int 一个 错误 转换 无效 vector const find lt gt value      更新时间:2023-10-16

我是c++的新手,正在试着玩一些"基本c++"书中的例子。当我从书中写这段代码时:

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

c++编译器给了我一个错误:

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;
}

我猜你是在做这样的事情

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;

这有一个额外的好处,当一个值没有在向量中找到时,它不会产生未定义的行为。

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

不能将非const变量更改为const

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

相关文章: