在the draft C++11 standard: N3337中,我发现了几个对top-level cv-qualifiers
的引用,但没有定义。
答案 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限定符
const
和volatile
出现在第二级。函数的签名包括该函数参数类型中出现的所有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。 - 例子]
更新
答案 2 :(得分:3)
我只在标准中找到了一个短语实例,并且
这是一个非规范性的说明。缺乏任何其他定义,
必须假设表达式被解释为它
通常是英文;限定符是最高的
类型声明的级别。当然,我们一般都会写
从左到右的声明(纯文本,而不是C ++),
不是从上到下,但通常的规则适用:左来
在右边之前,在向下之前。对于类似的东西
char *const p
,我们会写它(英文):“p是一个常量
指向char的指针。(在这种情况下,英语恰恰相反
我们将在C ++中使用的顺序。情况并非总是如此,
但是。)因为const
修改了左边的指针
大多数(顶部)元素,它是顶级限定符。