我一次使用多个数组。有些功能需要改变 数组,其他只需要阅读。以这些功能为例:
// 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);
有更简单的方法吗?
答案 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
。)