Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以在数组上使用const_cast来更改元素?_C++_Arrays_Pointers_Const Cast - Fatal编程技术网

C++ 是否可以在数组上使用const_cast来更改元素?

C++ 是否可以在数组上使用const_cast来更改元素?,c++,arrays,pointers,const-cast,C++,Arrays,Pointers,Const Cast,这更像是一个学术问题,因为我知道通常要避免const\u cast 但是我在第3章的练习中,C++中的思维27,第1卷。 创建一个常量数组double和一个volatile数组double。指数 通过每个数组并使用const_cast将每个元素强制转换为 分别为非常量和非易失性,并为每个 元素 我知道如何const\u castsingle vars: const int i = 0; int* j = const_cast<int*>(&i); *j = 1; //

这更像是一个学术问题,因为我知道通常要避免
const\u cast

但是我在第3章的练习中,C++中的思维27,第1卷。 创建一个常量数组double和一个volatile数组double。指数 通过每个数组并使用const_cast将每个元素强制转换为 分别为非常量和非易失性,并为每个 元素

我知道如何
const\u cast
single vars:

const int i = 0;
int* j = const_cast<int*>(&i);

*j = 1;    // compiles and runs
我哪里弄错了?

请注意:

const int i = 0;
int* j = const_cast<int*>(&i); 

*j = 1;    // UNDEFINED BEHAVIOR - modify actually const data
const int i=0;
int*j=常数(单位和单位);
*j=1;//未定义的行为-修改实际常量数据
不允许您通过丢弃最初声明为const的constness来修改对象。编译器可能会将对象(或数组,在您的情况下)的内容放在只读内存中,该内存在计算机中的级别低于编译器。当您写入时,可能会触发错误。如果它被声明为const,你必须永远遵守它,否则就会在你经历的过程中崩溃

只有当对象最初声明为非常量时,才可以在丢弃常量后进行修改。(也就是说,常量是后来添加的,可能是作为函数的参考参数。)

为了举例,让我们至少把你的问题换成一个有效的情况

// 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);
}
//f()引用数组,但添加常量
无效f(常数双(&arr)[10])
{
//在这里,可以抛弃常量并修改,因为
//底层对象未声明为const(尽管通常为
//函数不知道关于它的调用者,除了在
//受约束的情况。)
双*阵列=常数(arr);
数组[1]=99;
}
int main()
{
//注意:数组不是常量
双arr[10]{0,1,2,3,4,5,6,7,8,9};
f(arr);
}

这很好。

不能修改常量。对编译器撒谎并不能让它正常工作。你的两个例子都表现出未定义的行为。“编译并运行”是未定义行为的一种可能表现形式;“错误访问错误”是另一个错误。另见:。一本书,它是一个好主意写代码展示UB,我们应该说,不是一本非常好的书来研究C++从.<代码> *j=1;编译并运行。。但是,
能说明什么呢?这本书很古老,建议一般不要使用const_cast。如果可能的话,我只是想解决这个难题:-)还有,你从哪里得到这本书的?没有第32章。。你可以在网上免费获取一份,但是是的,它是古老的(出版于2000年),这是不正确的。抛开任何常量指针的常量都是非常好的,不管该指针指向什么。你的推理不适用;硬件限制不会在此类操作中发挥作用。只有UB可以修改常量对象,但可变子对象除外。瞧,你标记为UB的那条线实际上很好;下一行,
*j=1,是UB。谢谢@HWalters,我在你的提示下拧紧了螺栓
// 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);
}