int* test_prt(const vector<int>* array, const int index)
{
return array+index;
}
为什么第一个参数不能 const ?在这种情况下,“const”意味着什么是不可修改的?
答案 0 :(得分:2)
将const
放在类型名称后面是很常见的,因为它启用了“const to the left rule”。
这和你写的一样:
int* test_prt(vector<int> const* array, const int index)
{
return array+index;
}
这里,左边的项是向量,所以这是一个指向常量向量的指针。
如果你不使用这个约定,唯一的特殊情况是const
一直在左边(const的左边没有任何东西),这意味着它立即适用于const
的权利。
答案 1 :(得分:1)
array + index
不修改array
或index
,它只是计算两个操作数之间的总和而不影响原始值,因此代码按预期工作。此处的const
表示向量和index
都无法以任何方式更改。例如,如果我尝试更改array
个元素之一,则会收到错误:
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
答案 2 :(得分:0)
我还会删除整数前面的“const”。 因为它是一个通过值传递的arg,
int* test_prt(vector<int> const* array, int index)
{
return array+index;
}