这是const_cast未定义的行为吗?

Joh*_*itb 8 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;
Run Code Online (Sandbox Code Playgroud)

这是一种未定义的行为,通过读取int*它就像是一个int const*?我认为这是未定义的行为,但我以前认为只添加const一般是安全的,所以我不确定.

GMa*_*ckG 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
Run Code Online (Sandbox Code Playgroud)

请注意,const_cast(§5.2.11/ 3)的规则与资格转换的规则相同,但不要求在资格中单调增加.在你的情况下,因为你只是添加资格,这const_cast是不必要的.


关于别名,我不认为这是一个问题,或者至少它不是故意的.

就像你提到的那样,C++ 0x允许访问方法列表(§3.10)中有一个新的子弹,它允许类似的类型("类似"是由资格转换引起的类型).在C++ 03中,该子弹丢失了,但我怀疑关于允许更多cv资格访问的子弹是为了覆盖它,但从技术上讲并非如此(也就是说,委员会忽略了这一点).