下面的代码是处理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();
}
我的问题是,
0
初始化,那么即使下次进行类型转换也不起作用。做这种类型转换是不确定的行为吗?this
指针也是TYPE* const
类型,那么为什么编译器不允许对this
执行相同的操作?答案 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)
正如其他人所说,这是未定义的行为,因为它试图修改const
对象。如果用零初始化它,则编译器可能将其视为编译时常量,并忽略任何修改它的尝试。或者它可能会做一些完全不同的事情。
this
不是TYPE * const
类型的普通变量;它是TYPE *
类型的右值表达式。这意味着它根本不能用作赋值表达式的目标,也不能绑定到非常量引用。