如何理解C++标准N3337中的expr.const.cast子句8

How to understand expr.const.cast clause 8 in C++ standard N3337?

本文关键字:const cast 子句 expr 中的 何理解 C++ 标准 N3337      更新时间:2023-10-16

在C++标准草案N3337部分[expr.const.cast]/8:

以下规则定义了称为抛出常量的过程。在这些规则中,Tn和Xn表示类型。对于两种指针类型:

X1是T1cv1,1*…cv<1,>N*T1不是指针型

X2是T2cv2,1*…cv2,M*T2不是指针型

K是最小(NM(

如果对于非指针类型T,不存在从的隐式转换(Clause conv(,则从X1到X2的强制转换将消除常量

Tcv1,(N-K+1(*cv<1>

Tcv2,(M-K+1(*cv<2,(>M-K+2(……cv2、M*

我看不懂这个子句,所以我在C++标准草案N4659中查找了相应的子句[expr.const.cast]/7:

从类型T1到类型T2的转换消除了常数。如果T1和T2不同,则存在T1的cv分解,产生n,使得T2具有形式的cv解

cv cv n 2U2

并且不存在将T1转换为的资格转换

cv cv n 2U1

但我仍然无法理解T1,T2T之间的关系。帮帮我,谁能解释这个条款?

在旧版本中,引入了一个(大部分(任意的T,只是为了消除

const int *p=0;
auto q=reinterpret_cast<char*>(p);  // error: casts away constness

从CCD_ 3变为CCD_。它被有效地重写为

auto __q=reinterpret_cast<const char*>(p);  // ok
char *q=__q;  // error

新版本只是明确地重用U1,而不是发明T