C ++ 11标准中“顶级cv-qualifiers”的定义在哪里?

时间:2014-07-10 12:40:06

标签: c++ c++11 language-lawyer

the draft C++11 standard: N3337中,我发现了几个对top-level cv-qualifiers的引用,但没有定义。

3 个答案:

答案 0 :(得分:18)

来自Dan Saks的Top-Level cv-Qualifiers in Function Parameters

  

在C ++中,应用于类型的第一级的cv限定符称为 toplevel cv-qualifier。例如,在:

T *const p;
     

顶级cv限定符为const,并且位于:

T const *volatile q;
     

顶级cv限定符为volatile。另一方面:

T const volatile *q;
     

没有顶级cv限定符。在这种情况下,cv限定符constvolatile出现在第二级。

     

函数的签名包括该函数参数类型中出现的所有cv限定符,但出现在参数类型顶层的限定符除外。

     

例如,在:

int f(char const *p);
     

const限定符不在参数声明的顶层,因此它是函数签名的一部分。

     

另一方面,在:

int f(char *const p);
     

const限定符位于顶层,因此它不是函数签名的一部分。此功能具有与以下相同的签名:

int f(char *p);

我在标准中找不到定义,但我在上面发布的内容在N3337§8.3.5-5中明确说明

  

生成参数类型列表后,任何顶级   修改参数类型的cv-qualifiers在形成时删除   功能类型。


编辑: 在撰写上述帖子时,无法找到标准中的定义,但现在有一个as pointed out by Shafik

n4296摘录:

  

在本国际标准中,符号cv(或cv1,cv2等),   用于描述类型,代表任意一组   cv-qualifiers,即{const},{volatile},{const,volatile}之一,或   空集。对于类型cv T,它的顶级cv限定符   type是cv表示的类型。 [例子:对应的类型   type-id const int&没有顶级的cv-qualifiers。类型   对应于typeid volatile int * const具有顶级   cv-qualifier const。对于类C类,对应的类型   type-id void(C :: * volatile)(int)const具有顶级cv限定符   易挥发。 - 结束例子]

答案 1 :(得分:6)

这个问题是defect report 609: What is a “top-level” cv-qualifier? 的主题,其中说:

  

短语“顶级cv-qualifier”在标准中多次使用,但未定义。这个短语可能会被误解,表明const就像const T&处于“最高级别”,因为它出现在允许的最高级别: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中找到新的措辞。

答案 2 :(得分:3)

我只在标准中找到了一个短语实例,并且 这是一个非规范性的说明。缺乏任何其他定义, 必须假设表达式被解释为它 通常是英文;限定符是最高的 类型声明的级别。当然,我们一般都会写 从左到右的声明(纯文本,而不是C ++), 不是从上到下,但通常的规则适用:左来 在右边之前,在向下之前。对于类似的东西 char *const p,我们会写它(英文):“p是一个常量 指向char的指针。(在这种情况下,英语恰恰相反 我们将在C ++中使用的顺序。情况并非总是如此, 但是。)因为const修改了左边的指针 大多数(顶部)元素,它是顶级限定符。