C++ 这是const_cast未定义的行为吗?

C++ 这是const_cast未定义的行为吗?,c++,const-cast,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; //案例1: int*p=0; int const*q=*const_cast(&p); //

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

// 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;
//案例1:
int*p=0;
int const*q=*const_cast(&p);
//案例2:(我认为这是一样的)
int*p=0;
int const*const*pp=&p;
int const*q=*pp;

通过读取
int*
是否将其视为
int常量*
,这是一种未定义的行为?我认为这是一种未定义的行为,但我以前认为通常只添加
const
是安全的,所以我不确定

就资格而言,这很好。将每个表达式拆分为一个语句:

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
请注意,
常量(§5.2.11/3)的规则与资格转换的规则相同,但没有资格单调增加的要求。在您的情况下,因为您只添加了限定条件,
const\u cast
是不必要的


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


正如您所提到的,C++0x允许访问方法列表(§3.10)中有一个新的项目符号,它允许类似的类型(“类似”是由限定转换产生的类型)。在C++03中,该项目符号缺失,但我怀疑关于允许更多cv限定访问的项目符号旨在涵盖这一点,但技术上并非如此(也就是说,委员会忽略了这一点)。

您是在问我们!:-)作为一个有趣的问题,你有一个真实世界的用例吗?和你一样,我一直认为添加constness不会破坏任何东西。@unaperson啊,我刚刚读了上一个c++0x规范,结果它找到了答案!我今天和我的同事讨论了这个问题,他在“T”的“T”后面加了“const”表示“T*”作为一个interator适配器,遇到了一个要求进行隐式转换的问题。我认为这是完全正确的,我看不出有任何危险。你的意思是说,将例如
double*
传递给采用
double const*
的函数会导致UB吗?如果这是真的,我会很惊讶true@ildjarn:一个相关问题是将转换后的
double**
传递到采用
double const**
的函数中是否为UB(当该函数使用它时),但您给出的示例不是UB的结果。如果这是UB,我的意思是。@GMan我的意思是,如果我用“int const*”类型的左值读取“int*”,这不是一个别名冲突吗?当我今天查看规范时,我似乎没有注意到他们在别名规则列表中为C++0x添加了一个新的项目符号@GMan“int const*”并不是一个更符合cv标准的“int*”版本。“int*const”应该是。@Johannes:哦,是的,我现在明白了,我也明白了。这很有趣,因为我认为我现在在回答中提到的子弹的目的是为了覆盖新添加的子弹,但肯定有疏忽(或者我只是希望从中得到更多)。你知道为什么吗?谢谢你的回答!手续: