Mao*_*Mao 11 c++ language-lawyer c++11
在草案C++ 11标准:N3337中,我发现了几个引用top-level cv-qualifiers,但没有定义.
Mar*_* A. 18
在C++中,应用于类型的第一级的cv限定符称为顶级 cv限定符.例如,在:
Run Code Online (Sandbox Code Playgroud)T *const p;顶级cv-qualifier是
const,并在:Run Code Online (Sandbox Code Playgroud)T const *volatile q;顶级cv-qualifier是
volatile.另一方面:Run Code Online (Sandbox Code Playgroud)T const volatile *q;没有顶级的cv-qualifiers.在这种情况下,CV-预选赛
const,并volatile出现在第二个层次.函数的签名包括出现在该函数的参数类型中的所有cv限定符,除了出现在参数类型顶层的那些限定符.
例如,在:
Run Code Online (Sandbox Code Playgroud)int f(char const *p);在
const预选赛是不是在参数声明顶层,所以它是函数签名的一部分.另一方面,在:
Run Code Online (Sandbox Code Playgroud)int f(char *const p);在
const预选赛是在顶层,所以它不是函数签名的一部分.此功能具有与以下相同的签名:Run Code Online (Sandbox Code Playgroud)int f(char *p);
我无法在标准中找到定义,但我在上面发布的内容在N3337§8.3.5-5中明确说明
生成参数类型列表后,在形成函数类型时,将删除修改参数类型的任何顶级cv限定符.
编辑:在撰写上述文章时,无法找到标准中的定义,但现在Shafik指出了一个定义:
n4296摘录:
在本国际标准中,在类型描述中使用的符号cv(或cv1,cv2等)表示任意一组cv限定符,即{const},{volatile},{const,volatile之一},或空集.对于类型cv T,该类型的顶级cv限定符是由cv表示的那些.[示例:与type-id const int对应的类型&没有顶级cv限定符.对应于typeid volatile int*const的类型具有顶级cv-qualifier const.对于类类型C,对应于type-id void(C ::*volatile)(int)const的类型具有顶级cv-qualifier volatile. - 结束例子]
这个问题是缺陷报告609的主题:什么是"顶级"cv-qualifier?其中说:
短语"顶级cv-qualifier"在标准中多次使用,但未定义.这个短语可能会被误解为表示const T&之类的const处于"最高级别",因为它出现的地方是允许它的最高级别:T&const是不正确的.
建议的决议建议增加以下措辞和说明:
对于类型cv T,该类型的顶级cv限定符是由cv表示的那些.[示例:对应于type-id"const int&"的类型没有顶级cv限定符.对应于type-id"volatile int*const"的类型具有顶级cv-qualifier const.对于类类型C,对应于type-id"void(C ::*volatile)(int)const"的类型具有顶级cv-qualifier volatile. - 末端的例子]
更新
缺陷已将状态更改为DRWP,这意味着它现在已成为最新草案标准的一部分,我们可以在N4527中找到新的措辞.