使用const抛出const

不是。这个问题的重复时间应该是static_cast,dynamic_cast,const_cast和reinterpret_cast何时使用?

这里提出的问题与描述为重复的链接没有任何相似之处。

第一个问题:我使用下面的const_cast两种情况。 其中一个作品。 另一个没有。

1. int * const //工作。

在此语法中,变量将指向的地址不能更改。 所以我使用const_cast作为下面,它的工作原理:

`
int j=3;
int *k=&j;
int *m=&j;
int* const i=k; 
const_cast<int*>(i)=m; //OK: since i=m would not work so cast is necessary`

2. const int * //不起作用。

被指向的地址可以改变,但是该值不能改变(尽管可以通过将变量指向不同的地址来改变)。 我使用的const_cast在这里似乎不起作用:

`
int j=9;
int *k=&j;
const int* i1=0;
i1=k; //OK
//*i1=10;//ERROR.`

所以我试图通过各种方式,如下所示,但没有任何工作:

const_cast<int*>(i1)=10;
const_cast<int*>(*i1)=l;
*i1=const_cast<int>(l);
*i1=const_cast<int*>(10);

第二个问题:所有的转换只能用于指针和引用吗? 以下示例在图片中没有指针或引用的情况下无效?

const int a=9;
int b=4;
const_cast<int>(a)=b; //cannot convert from 'int' to 'int'. why is compiler
                      //trying to convert from int to int anyways or fails         
                      //when both the types are same.

第一个答案 :在你的例子中,你试图强制编译器做一些可以像这样解释的东西

const_cast<int*>(i1)=10; //int* = int: assign address to pointer
const_cast<int*>(*i1)=l; //const_cast<int*>(int): cast the value under pointer to pointer
*i1=const_cast<int>(l); //const_casting from const values is forbidden
*i1=const_cast<int*>(10); //10 is an rvalue

你真正想在这里做的是取消引用非const的指针。 这就是为什么你需要这样做:

int j = 9;
int *k = &j;
const int* i1 = 0;
i1 = k;
*(const_cast<int*>(i1)) = 10;

相当于

int j = 9;
int *k = &j;
const int* i1 = 0;
i1 = k;
int* temp = const_cast<int*>(i1); //you get rid of 'const'...
*temp = 10; //...and now you assign value as you wanted to - this operation became available

第二个答案const_cast const值被禁止,因为它会导致未定义的行为。 您只能从指针或引用中删除指向最终不是真的const指针或引用,并且只有指针不允许您修改其值。

这个问题在这个答案中描述得非常好。


const_cast应用于表达式而不是对象,本身也是一个表达式:

§5.2.11 [expr.const.cast] / p1:

表达式const_cast<T>(v)是类型T 如果T是对对象类型的左值引用,则结果是左值; 如果T是对象类型的右值引用,则结果是一个xvalue; 否则,结果是一个prvalue,对表达式v执行左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)的标准转换

  • const_cast<int*>(i)=m;
  • 此调用无效,因为赋值的左侧有一个prvalue值类别,而int* prvalue不支持赋值。 正确的语法是const_cast<int*&>(i)=m; ,但由于i在你的例子中被声明为const ,它会调用未定义的行为†。

  • const_cast<int*>(*i1)=l;
  • 取消引用类型为int*的指针会创建一个左值类型的表达式,并且由于转换表达式位于赋值的左侧,因此它应该是对左值引用类型的const_cast<int&>(*i1)=10; ,即const_cast<int&>(*i1)=10; (前提是无论i1指向什么都没有声明为const )。

  • const_cast<int>(a)=b;
  • const_cast<int>(a)部分本身是有效的,特别是可以将const_cast应用于表示不属于引用类型的指针类型的对象的表达式。 但由于它位于分配的左侧,因此不会编译。 即使你把它改为const_cast<int&>(a)=b; 它会触发未定义的行为,因为a被声明为const †。


    †§7.1.6.1 [dcl.type.cv] / p4:

    除了可以修改任何声明mutable的类成员(7.1.1)外,任何在其生命周期(3.8)期间修改const对象的尝试都会导致未定义的行为。

    链接地址: http://www.djcxy.com/p/28759.html

    上一篇: casting away the constness using const

    下一篇: are member pointers fixed in size and reinterpret