【问题标题】:Where is the definition of `top-level cv-qualifiers` in the C++11 Standard?C++11 标准中“顶级 cv-qualifiers”的定义在哪里?
【发布时间】:2014-07-10 12:40:06
【问题描述】:

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

【问题讨论】:

  • cv-qualifiers有定义,top-level是标准英文单词,不需要定义。
  • @Deduplicator 正如我在下面的回答中指出的那样,有一个缺陷报告,没有这个,它没有被拒绝为NAD,所以我认为这并不明显

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


【解决方案1】:

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

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

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 限定符在形成 函数类型。


编辑: 在撰写上述帖子时,无法找到标准中的定义,但现在有一个 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 限定符 const。对于类类型 C,对应的类型 type-id void (C::* volatile)(int) const 具有* cv 限定符 易挥发的。 —结束示例]

【讨论】:

  • 虽然没有回答问题。
  • @juanchopanza 已编辑:标准中没有明确解释它的定义,但我添加了一段说明函数顶层剥离的段落。
  • 标准似乎没有top-level cv-qualifiers 的定义。我接受你对上面提供的优秀文章的回答。谢谢。
  • @juanchopanza 很好,这是一种推断定义的创造性方法,但我不确定8.3.5p5 是否在没有定义的情况下得到了很好的指定。正如我在回答中指出的那样,它现在至少是最新草案的一部分,尽管一旦它变成 C++17,它可能会发生变化,至少这个问题是通过缺陷报告跟踪的。
  • @ShafikYaghmour 感谢您给我机会去了解新标准。似乎 n4296 在撰写本文时添加了该定义
【解决方案2】:

这个问题是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 限定符。对应于类型 id “volatile int * const”的类型具有* cv 限定符 const。对于类类型 C,对应于类型标识“void (C::* volatile)(int) const”的类型具有* cv 限定符 volatile。 ——结束示例]

更新

该缺陷已将状态更改为DRWP,这意味着它现在是最新草案标准的一部分,我们可以在N4527 中找到新措辞。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您的示例中最左边的元素是char,也可以与指针分开限定...或者您说的是英文版?你的解释令人困惑。
    • @rubenvb 我说的是英文版。在 C++ 版本中查找最顶层需要解析。结果是英文版本,它在最左边。
    • @rubenvb 不行。你必须把声明解析成英文,然后取最左边的。 (考虑类似void (*const fp)( char const* ),其中第一个const 是最顶部的。)
    • 嗯,对于函数指针,您必须忽略参数,并查看函数指针变量的声明,但仍然是从右到左。备案:void(*const* fp)(char const* const) 没有*限定符。 fp 部分中最右边的指针是不合格的。不管怎样,C 指针语法让每个人都流血了。
    • @rubenvb 这不仅仅是函数指针。任何时候我们在类型中使用括号。
    最近更新 更多