将左const添加到指针数组

时间:2017-03-26 10:32:00

标签: c++ const

我一次使用多个数组。有些功能需要改变 数组,其他只需要阅读。以这些功能为例:

// Only needs to read from the two arrays.
void f(int const *a[2]) { /* ... */ }

// Changes the two arrays.
void g(int *a[2]) { /* ... */ }

我希望我可以用非const数组调用它们。添加一个 最右边const始终是可能的,左边的const确实会改变 类型。我仍然认为const只会使它变得更加严格 应该是可能的。

数据结构可能如下所示:

int *a[2] = {new int[10], new int[10]};

调用g不是一个问题,它可以干净地编译:

g(a);

但是,当我使用f尝试相同时,它不起作用:

f(a);

g++

const_cast.cpp: In function 'int main(int, char**)':
const_cast.cpp:12:8: error: invalid conversion from 'int**' to 'const int**' [-fpermissive]
     f(a);
        ^

clang++给出的消息略有不同:

const_cast.cpp:12:5: error: no matching function for call to 'f'
    f(a);
    ^
const_cast.cpp:4:6: note: candidate function not viable: no known conversion from 'int *[2]' to 'const int **' for 1st
      argument
void f(int const *a[2]) {}
     ^

然后我尝试使用const_cast来强制转换:

f(const_cast<int const(*)[2]>(a));

这不起作用,因为它也改变了间接的数量。

const_cast.cpp:22:36: error: invalid const_cast from type 'int**' to type 'const int (*)[2]'
     f(const_cast<int const(*)[2]>(a));
                                    ^

但我不想放宽对f的要求。应该很清楚 用户该函数不会改变数组的内容。也 在代码库中还有其他一些我不想改变的情况。

使用正确的const创建新变量确实有效:

int const *const_a[2] = {a[0], a[1]};
f(const_a);

有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

int const*int*是不相关的类型,您无法将指向后者的指针转换为指向前者的指针。

你不能这样做是因为它不安全,但问题不在于该功能可能会修改阵列,它可以用一个替换阵列那是不可修改的。

考虑

int const constants[] = {1,2,3};

void f(int const** a)
{
    *a = constants; // OK, *a and &constants[0] are int const*.
}

int main() 
{
    int* x;
    f(&x);
    x[0] = 0; // Modifying a const object; undefined behaviour.
}

(请注意,在函数参数中,T x[2]相当于T x[]T* x。)