这是一个学术问题,因为我知道通常会避免const_cast
。
但是我正在进行第3章的练习,#27,Thinking in C ++,Vol。 1。
创建一个double的const数组和一个double的volatile数组。指数 通过每个数组并使用const_cast将每个元素转换为 分别为非const和非volatile,并为每个赋值 元件。
我看到如何const_cast
单个变种:
const int i = 0;
int* j = const_cast<int*>(&i);
*j = 1; // compiles and runs
但无法弄清楚如何让它与数组一起工作。以下编译,但抛出“错误访问”异常,好像const
仍在那里。
const int sz = 10;
const double cd[sz] {0,1,2,3,4,5,6,7,8,9};
volatile double vd[sz] {0,1,2,3,4,5,6,7,8,9};
double* cdp = const_cast<double*>(cd);
double* vdp = const_cast<double*>(vd);
cdp[0] = 99; // bad access error
我哪里弄错了?
答案 0 :(得分:2)
请注意:
const int i = 0;
int* j = const_cast<int*>(&i);
*j = 1; // UNDEFINED BEHAVIOR - modify actually const data
您不允许通过丢弃最初声明为const的constness来修改对象。编译器可以将对象(或数组,在您的情况下)的内容放在只读存储器中,该存储器在机器中比编译器更低级别强制执行。写入时,可能会触发故障。如果它被声明为const,你必须永远尊重它,或者在遇到崩溃时崩溃。
如果对象最初被声明为非const,则在抛弃constness之后只能 修改。 (也就是说,后来添加了constness,可能作为函数的参考参数。)
为了举例,让我们将你的问题重新解释为至少一个有效的情况。
// f() takes a reference to an array, but add constness
void f(const double(&arr)[10])
{
// Here it's ok to cast away constness and modify since the
// underlying object isn't declared const (though in general a
// function doesn't know that about its caller, except in
// constrained situations.)
double * array = const_cast<double*>(arr);
array[1] = 99;
}
int main()
{
// NOTE: array is NOT CONST
double arr[10] {0,1,2,3,4,5,6,7,8,9};
f(arr);
}
这很好。