如何理解C++标准N3337中的expr.const.cast子句8
How to understand expr.const.cast clause 8 in C++ standard N3337?
在C++标准草案N3337部分[expr.const.cast]/8:
以下规则定义了称为抛出常量的过程。在这些规则中,Tn和Xn表示类型。对于两种指针类型:
X1是T1cv1,1*…cv<1,>N*T1不是指针型
X2是T2cv2,1*…cv2,M*T2不是指针型
K是最小(N,M(
如果对于非指针类型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,T2
和T
之间的关系。帮帮我,谁能解释这个条款?
在旧版本中,引入了一个(大部分(任意的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。