Mar*_* A. 18

来自Dan Saks的功能参数中顶级cv限定符:

在C++中,应用于类型的第一级的cv限定符称为顶级 cv限定符.例如,在:

T *const p;
Run Code Online (Sandbox Code Playgroud)

顶级cv-qualifier是const,并在:

T const *volatile q;
Run Code Online (Sandbox Code Playgroud)

顶级cv-qualifier是volatile.另一方面:

T const volatile *q;
Run Code Online (Sandbox Code Playgroud)

没有顶级的cv-qualifiers.在这种情况下,CV-预选赛const,并volatile出现在第二个层次.

函数的签名包括出现在该函数的参数类型中的所有cv限定符,除了出现在参数类型顶层的那些限定符.

例如,在:

int f(char const *p);
Run Code Online (Sandbox Code Playgroud)

const预选赛是不是在参数声明顶层,所以它是函数签名的一部分.

另一方面,在:

int f(char *const p);
Run Code Online (Sandbox Code Playgroud)

const预选赛是在顶层,所以它不是函数签名的一部分.此功能具有与以下相同的签名:

int f(char *p);
Run Code Online (Sandbox Code Playgroud)

我无法在标准中找到定义,但我在上面发布的内容在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. - 结束例子]

  • 但是不回答这个问题. (2认同)

Sha*_*our 6

这个问题是缺陷报告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中找到新的措辞.