const vector <t> *哪个部分是const?</t>

时间:2013-07-03 02:20:57

标签: c++ vector const

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

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

3 个答案:

答案 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不修改arrayindex,它只是计算两个操作数之间的总和而不影响原始值,因此代码按预期工作。此处的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;
 }