我是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;
}
答案 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*
类型的内容,那么这将允许您更改不可更改的整数 - 因此来自编译器的抱怨。