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 constvolatile出现在第二级。

函数的签名包括出现在该函数的参数类型中的所有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”的定义在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

#import 是 C++11 标准的一部分吗?

什么是 C++11 标准中的消费操作?

C++11 标准在哪里声明了 std::fmodf?

C++11新特性:18—— C++11 long long超长整形详解

C++ 标准委员会是不是打算在 C++11 中 unordered_map 破坏它插入的内容?

第一章 C语言编程