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

C++ 如何将真正不可变的2D数组传递给函数?,c++,arrays,constants,C++,Arrays,Constants,我有这个功能: 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; } vo

我有这个功能:

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;
}
void foo(常量double*const*矩阵、无符号num\u行、无符号num\u列){
//矩阵[0][0]=5;//错误:表达式必须是可修改的左值
对于(无符号i=0;i
…其中,函数无法更改矩阵中任何给定索引处的值,但仍能删除矩阵或其任何行。是否有办法传入2D矩阵并保证其不会以任何方式被更改


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

没有。但无论如何,你不应该使用
new
delete
和原始指针,当然也不应该使用
delete
任意指针

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

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

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

也没有办法阻止某人这样做

unsigned char *p = (unsigned char *)your_precious_data_pointer;
*p = 42;
忘掉它

Const correction的设计目的是检测意外错误,而不是防止程序员的故意行为。这与安全无关


如果它是防止意外错误的好工具,甚至可能会引起争论。

我会先转储原始数组来执行此操作,但使用
std::array
std::vector
查看“关于为什么对于(密集)矩阵,您最可能不希望使用数组的二维动态数组或
vector
”。我的答案有一个小的矩阵示例类。(当然,你可以只使用
向量
并自己处理映射。)酷提示,像素化学家。但是如果我知道我的矩阵的大小,并且知道它永远不会改变,我认为向量的向量对于我作为开发人员和用户来说都会更容易可视化。该程序将(静态)图像作为输入并输出有关它的一些数据。我宁愿让用户构建一个二维向量,而不是让他们学习一维方法。你同意吗?@user3076399:我宁愿用
矩阵m(20,20)来上课
和类似于
m[0][0]=1.0的东西
m(0,0)=1.0因为安全使用向量向量需要检查每个子向量的大小/边界等@Pixelchemist每个子向量的长度都将始终相同,因为矩阵是正方形的。为什么不呢?我应该用什么来代替呢?@juanchopanza。我给自己留了一点余地,不要键入“指向一个数组的第一个元素的指针指向更多
double
s数组的第一个元素”。@Quentin是的,但我们甚至不知道它是指向数组第一个元素的指针。就函数而言,参数是一个指针。@juanchopanza信任调用者,因此
for
-loop不只是从数组的末端射入UB-land。原始指针毕竟都是关于信任的。@user3076399您应该看看
std::vector
std::unique\u ptr