“为什么?”;int*查找(常量向量<;int>;&vec,int值)";给我一个无效的转换错误? 我是C++新手,在《本质C++》中尝试着玩一些例子。当我从书中写下这段代码时: 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*查找(常量向量<;int>;&vec,int值)";给我一个无效的转换错误? 我是C++新手,在《本质C++》中尝试着玩一些例子。当我从书中写下这段代码时: 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; },c++,compiler-construction,constants,C++,Compiler Construction,Constants,我试着把它改成 const int *find(const vector<int> &vec, int value) const int*find(const vector&vec,int值) 而且效果很好 所以我只是想知道有什么具体的原因吗?谢谢 以下是本书中的代码: int *find(const vector<int> &vec, int value) { ... } int* find(const vector<int> &

我试着把它改成

const int *find(const vector<int> &vec, int value)
const int*find(const vector&vec,int值)
而且效果很好

所以我只是想知道有什么具体的原因吗?谢谢

以下是本书中的代码:

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(常量向量和向量,int值){
对于(intix=0;ix
最有可能
find()
返回的值是
const
,但函数定义指定返回类型不是
const

不能将非
常量
变量更改为
常量


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

我猜您正在执行类似的操作

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

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

这取决于您返回的内容……看起来您返回的值是常量。您可以发布函数体吗?只需使用
std::find
。可以。这正是我在代码中所做的。那么这是否意味着编译器会检查代码是否从常量容器返回地址?@zhxb515正确,编译器可以检查常量,而您得到的是一个错误。您的函数也不能保证返回。这是我所指的未定义的行为。编译器会给你一个警告。哦,是的。我忘记键入“return0;”。谢谢!