我想知道以下是否是未定义的行为
// Case 1:
int *p = 0;
int const *q = *const_cast<int const* const*>(&p);
// Case 2: (I think this is the same)
int *p = 0;
int const *const *pp = &p;
int const *q = *pp;
这是一种未定义的行为,通过阅读int*
就好像它是int const*
一样吗?我认为这是未定义的行为,但我之前认为只添加const
一般是安全的,所以我不确定。
答案 0 :(得分:5)
资格认证,没关系。将每个表达式拆分为一个语句:
int *p = 0; // ok
int **addrp = &p; // ok
int const *const *caddrq = addrp; // ok, qualification conv. according to §4.4/4
int const *q = *caddrq; // ok
请注意,const_cast
(§5.2.11/ 3)的规则与资格转换的规则相同,但不要求在资格中单调增加。在您的情况下,因为您只需要添加资格,const_cast
是不必要的。
关于别名,我不认为这是一个问题,或者至少不是这个问题。
正如您所提到的,C ++ 0x允许访问方法(§3.10)列表中有一个新的子弹,它允许类似的类型(“类似”是由资格转换产生的类型)。在C ++ 03中,这个子弹丢失了,但我怀疑关于允许更多cv资格访问的子弹是为了掩盖这一点,但从技术上讲并非如此(也就是说,委员会忽略了这一点)。