如何解决为什么“ TYPE * const”指针的行为不同?
| 下面的代码处理一个“ 0”指针。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
类型,那么为什么编译器不允许compiler3ѭ进行相同的操作?
解决方法
正如其他人所说,这是未定义的行为,因为它试图修改“ 6”对象。如果将其初始化为零,则编译器可能会将其视为编译时常量,而忽略任何对其进行修改的尝试。否则它可能会做一些完全不同的事情。
this
不是TYPE * const
类型的普通变量;它是类型为“ 9”的右值表达式。这意味着它根本不能用作赋值表达式的目标或绑定到非常量引用。
, 进行这种类型转换是未定义的行为吗?
是。
(D*&)p = new D;
在尝试更改const指针时,它将调用未定义的行为。
回想一下,“ 11”声明了一个变量“ 12”,它是指向非常量“ 14”的“ 6”指针。
,D* const p = 0;
这个声明说p
是指向D
的指针,D
是恒定的,也就是说它永远不会改变。总是0。
cout<<\"p = \"<<p<<endl;
在这里显示p的值,您之前说过它始终为0。猜猜为什么显示0!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。