8

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

// 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;

这是通过将 aint*视为a 来读取的未定义行为int const*吗?我认为这是未定义的行为,但我之前认为只添加const一般是安全的,所以我不确定。

4

1 回答 1

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 限定访问的项目符号旨在涵盖这一点,但技术上并非如此(也就是说,委员会忽略了这一点)。

于 2011-05-11T20:10:06.560 回答