这是const_cast未定义的行为吗?

时间:2011-05-11 19:57:13

标签: c++ const-cast

我想知道以下是否是未定义的行为

// 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一般是安全的,所以我不确定。

1 个答案:

答案 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资格访问的子弹是为了掩盖这一点,但从技术上讲并非如此(也就是说,委员会忽略了这一点)。