0
int* test_prt(const vector<int>* array, const int index)
{
    return array+index;
}

为什么第一个参数不能是const?在这种情况下,“const”意味着什么不能修改?

4

3 回答 3

2

通常放在const类型名称之后,因为它启用了“向左规则”。

这和你写的一样:

int* test_prt(vector<int> const* array, const int index)
{
    return array+index;
}

这里,左边的项目是向量,所以这是一个指向常量向量的指针。

如果你不使用这个约定,唯一的特殊情况是 whenconst一直在左边(const 左边没有任何东西),这意味着它适用于 . 右边的东西const

于 2013-07-03T02:25:23.313 回答
1

array + index没有修改arrayor index,它只是计算两个操作数之间的和而不影响原始操作数,因此代码按预期工作。这里的const意思是向量和index不能以任何方式改变。例如,如果我尝试更改arrays 元素之一,则会收到错误消息:

array[0] = 5; // error! assignment of read-only value

这同样适用于index。顺便说一句,我认为你的函数签名应该写成:

int* test_prt(const vector<int>& array, const int index)
{
    return &array[index];
    // or &array.at(index) which performs bounds checking
}

也就是说,我们通过引用获取向量,并使用其内部缓冲区指向的第一个元素的偏移量。通过引用获取是必不可少的,因为它避免了复制并返回指向本地副本的指针将是未定义的行为。您的原始代码只有在array是一个实际的向量数组时才有效!

为了清楚起见,以下是调用函数的方式:

std::vector<int> v = {1, 2, 3, 4, 5};

std::cout << test_ptr(v, 1); // prints the address of the 2nd element 
于 2013-07-03T12:39:34.900 回答
0

我还将删除整数前面的“const”。因为它是一个按值传递的参数,

int* test_prt(vector<int> const* array, int index)
{
     return array+index;
 }
于 2013-07-03T04:55:50.033 回答