为什么"int *find(const vector<int> &vec, int value)"会给我一个无效的转换错误?
Why does "int *find(const vector<int> &vec, int value)" gives me a invalid conversion error?
我是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*
的东西,那么这将允许您更改不可更改的整数-因此编译器会抱怨。
相关文章:
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 包装一个对象并假装它是一个 int
- cin >> int 给定一个字符串将 int 赋值为 0
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 我从int x[3]得到的一个非常奇怪的输出;
- 在 C++11 中利用 int*_t、int_fast*_t 和 int_least*_t 之间的差异的一个很好的例子是
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- c++:如何打印出一个强制转换的 int 值?
- 通过将其中一个模板更改为 muliset 后,我可以在 PBDS 排序集上使用计数功能<int>less_equal<int>
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 超过CPU时间限制:当MPI_Sent一个非常大的int*时
- 使用无符号int作为二进制来在c++中实现一个集
- 如何声明一个必须在C++中同时存储int和char值的2D数组
- 在int main()[c++]中实现一个递归函数
- 错误:"int pow(double,int)"与上一个声明int pov(double a,int
- CStringArray::GetAt(int index) 返回一个 const. 为什么?
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*