如何将真正不可变的2D数组传递给函数?

时间:2016-12-27 20:18:11

标签: c++ arrays const

我有这个功能:

void foo(const double *const *matrix, unsigned num_rows, unsigned num_columns){
    //matrix[0][0] = 5; // ERROR: expression must be a modifiable lvalue
    for (unsigned i = 0; i < num_rows; i++) delete matrix[i];
    delete matrix;
}

...其中函数不能改变矩阵中任何给定索引处的值,但它仍然能够删除矩阵或其任何行。有没有办法传递2D矩阵并保证不会以任何方式改变它?

编辑:看起来没有办法做到这一点,所以我可能会转而使用向量。

2 个答案:

答案 0 :(得分:1)

没有

delete可以在指针上调用,即使它作为const &传递或甚至声明为const,因为指针不会被更改。

也无法阻止某人做

unsigned char *p = (unsigned char *)your_precious_data_pointer;
*p = 42;

克服它。

Const正确性旨在检测意外错误,而不是用于阻止程序员的故意行为。这与安全无关。

如果它是防止意外错误的好工具,甚至可以辩论。

答案 1 :(得分:0)

没有。但是你不应该使用newdelete和原始拥有指针,当然不是delete任意指针。

如果这还不足以切换到智能指针和容器......您实际上是通过delete明显分配了new[]的内容来触发未定义的行为。用原始拥有的指针来注意另一个错误。

另一方面,这不是2D数组,而是指针数组。