这个问题特别与 C++98 相关,但如果您愿意,可以随意提供任何关于更新标准的有用信息。
如果您知道答案并想跳过其余部分,那么简短而有趣的是:
int **w;
int volatile* *x = w; // error
int volatile*const*y = w; // OK
int const *const*z = w; // OK
为什么要在声明中对const
权?如果允许声明 for ,某人可能会做出什么邪恶的事情?volatile
y
x
在标准的第4.4.4节中它说:
转换可以在多级指针中第一个以外的级别添加 cv 限定符,但须遵守以下规则:
如果存在类型 T 和整数n > 0,则两个指针类型 T1 和 T2 是相似的,使得:
- T1 是 CV10 点到 CV11 点到 ... CV1N T
- T2 是 CV20 点到 CV21 点到 ... CV2N T
...其中每个 CVij 是 const、volatile、const volatile 或什么都没有。指针类型中第一个之后的cv 限定符的 n 元组,例如指针类型 T1 中的 CV11、CV12、...、CV1N,称为指针类型的cv 限定签名。如果满足以下条件,则T1 类型的表达式可以转换为 T2 类型:
- 指针类型相似
- 对于每个j > 0,如果 const 在 CV1j 中,则 const 在 CV2j 中,对于 volatile 也是如此。
- 如果 CV1j 和 CV2j 不同,则 const 在每个 CV2k 中,因为0 < k < j
...然后继续给出一个将 a 分配给 a 的**
示例const**
。上面的重点是我的,斜体来自文档。
将其放入代码中:
int CV13* CV12* CV11* CV10 b1;
int CV23* CV22* CV21* CV20 b2 = b1;
我对一些细节有点模糊......所以这里有一些问题或可能有缺陷的观察:
1)它说at levels other than the first
;这不再详细说明,但CV20
可以是任何有效的 CV 限定词。
2)底部的第三条规则说,如果 T2在 level 处添加const
OR ,则 levels必须是 const (或遭受愤怒)。在下文中,星号的数量与顶部的星号不同,以强调第三条规则所说的内容:volatile
j
1 ... j-1
int *****w;
int **volatile* * *x = w; // error
int **volatile*const*const*y = w; // OK
int **const *const*const*z = w; // OK
我明白为什么需要它z
,但为什么需要y
需要呢?以下是 4.4.4 中示例的大致样子,针对 volatile 情况进行了修改:
void f( int **x ) {
int volatile**y = x; // not allowed
// do some evil here
}
那里可以放什么邪恶?