C ++ 11标准中“顶级cv-qualifiers”的定义在哪里?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ 11标准中“顶级cv-qualifiers”的定义在哪里?相关的知识,希望对你有一定的参考价值。
在the draft C++11 standard: N3337,我发现了几个引用top-level cv-qualifiers
,但没有定义。
来自Dan Saks的Top-Level cv-Qualifiers in Function Parameters:
在C ++中,应用于类型的第一级的cv限定符称为顶级cv限定符。例如,在:
T *const p;
顶级cv-qualifier是
const
,并在:T const *volatile q;
顶级cv-qualifier是
volatile
。另一方面:T const volatile *q;
没有顶级的cv-qualifiers。在这种情况下,cv-qualifiers
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限定符。
编辑:在撰写上述帖子时,无法找到标准中的定义,但现在有一个as pointed out by 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。 - 结束例子]
这个问题是defect report 609: What is a “top-level” 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找到新的措辞。
我只在标准中找到了一个短语实例,这是一个非规范性的说明。缺乏任何其他定义,必须假设表达式被解释为通常用英语表达;限定符位于类型声明的最高级别。当然,我们通常从左到右编写声明(用纯文本,而不是用C ++编写),而不是从上到下编写,但通常的规则适用:左边是右边,上面是下面。所以对于像char *const p
这样的东西,我们会写它(英文):“p是一个指向char的const指针”。 (在这种情况下,英语与我们在C ++中使用的顺序完全相反。但是,情况并非总是这样。)因为const
修改了指针,它是最左边(顶部)元素,所以它是顶部等级限定符。
以上是关于C ++ 11标准中“顶级cv-qualifiers”的定义在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
C++11新特性:18—— C++11 long long超长整形详解