为什么“TYPE * const”指针的行为不同?

时间:2011-04-14 05:58:39

标签: c++ pointers const this undefined-behavior

下面的代码是处理TYPE* const指针。

struct D {
  void Check ()
  {
    D* const p = new D; // 2nd test is "p = 0;"
    cout<<"p = "<<p<<endl;
    (D*&)p = new D;
    cout<<"p = "<<p<<endl; // prints 0, "p = 0;" at declaration
  }
};

int main ()
{
  D o;
  o.Check();
}

我的问题是,

  1. 如果使用0初始化,那么即使下次进行类型转换也不起作用。做这种类型转换是不确定的行为吗?
  2. this指针也是TYPE* const类型,那么为什么编译器不允许对this执行相同的操作?

3 个答案:

答案 0 :(得分:5)

  

进行这种类型转换是不确定的行为?

(D*&)p = new D;

它会调用未定义的行为,因为它会尝试更改const指针。

回想一下,D* const p声明了一个变量p,它是指向非const const的{​​{1}}指针。

答案 1 :(得分:2)

D* const p = 0;

这个声明说p是指向D的指针,它是永恒的,也就是永远不会改变。 总是 0。

cout<<"p = "<<p<<endl;

在这里显示p的值,您之前说过总是为0.猜猜为什么会显示0!

答案 2 :(得分:1)

  1. 正如其他人所说,这是未定义的行为,因为它试图修改const对象。如果用零初始化它,则编译器可能将其视为编译时常量,并忽略任何修改它的尝试。或者它可能会做一些完全不同的事情。

  2. this不是TYPE * const类型的普通变量;它是TYPE *类型的右值表达式。这意味着它根本不能用作赋值表达式的目标,也不能绑定到非常量引用。