这是一个几乎是私人的ISO 14882的内容翻译,希望看官指出不足!
http://eel.is/c++draft/conv.qual
1
一个类型T的cv-decomposition(cv分解)是一系列的cvi和Pi的组合,例如T是:cv0P0cv1P1...cvn-1Pn-1cvn U
其中n > 0
并且cvi是一系列的cv限定符号,每个P是一个指针,意为指向...比如:指向类型类Ci的成员指针,长度为Ni的数组,或者是未知边界的数组,如果P指向的是一个数组,那么在元素类型上的cv限定符cvn+1同样也作为数组的cv限定符cvn
[例如:由type-id表示的类型表示const int** 有两层cv-decomposition(cv分解),其中上式中的U就可以是int和指向const int 的指针]
<译者注:该例中,作为一个type-id为const int** 那么存在,第一层为:去除T的P和cv得:cv为空 U为const int * P为*,第二层则继续去除,U为cv p U,U为int>
最长的cv分解T中第一个cv分解之后的n个cv限定符组成的元组cv1,cv2...cvn就叫类型T的cv限定标志
<译者注:按照上例可知,第一个cv和p之后,类型const int ** 的cv限定标志为空>
2
如果T1T2都有n个且有相对应的pi和同样的类型表示U,那么这两个类型相似(similar)
<注:例如:const int **和const int *const *,此时对于第一层分解来说,U同为const int *,也有对应的p>
3
一个纯右值的类型为 T1可以在以下条件符合的情况下被转换为T2:
3.1:
T1和T2类型相似
3.2:
对于每个T1和T2中的const和volatile,当i>0时,都有cvi1和cvi2相似
3.3:
当cvi1和cvi2不相同时,那么const都在cvk2(0<k<i)中
[注记:如果类型T **可以给类型const T ** 赋值(就是说,标号为#1的哪一行之后是允许的),那么这个程序就可能无意中修改const对象(就像#2中的一样):
int main(){
const char c = 'c';
char *pc;
const char ** pcc = &pc; //#1:不允许的
*pcc = &c;
*pc = 'C'; //#2:修改了一个const的对象
}
]
4:
[注记:一个类型为纯右值的"指向cv1 T的指针"可以被转换为一个"指向cv2 T的指针"的纯右值,只要"cv2 T"比"cv1 T"更加具有cv限定的.一个类型为纯右值的"类型为cv1 T的指向X成员的指针"可以被转换为一个"类型为cv2 T的指向X成员的指针"的纯右值类型,只要"cv2 T"比"cv1 T"更加具有cv限定]
<译者例:static_cast的类型转换>
5:
[注记:函数类型(包括指向成员函数的指针类型)从不具有cv限定]
网友评论