C++ 中的“cv-unqualified”是什么意思?

What does "cv-unqualified" mean in C++?

提问人:Stefano Borini 提问时间:3/14/2013 最后编辑:Sabito stands with UkraineStefano Borini 更新时间:11/23/2023 访问量:14305

问:

从主题。我在最近问的一个问题中看到了这个术语,显然这是一个公认的术语,但我无法在 Stack Overflow 上找到任何内容。

C C++-常见问题

评论

0赞 Stefano Borini 3/14/2013
@LihO:根据我对 stackoverflow 的了解,复制粘贴不是解决问题的首选方法。它通常涉及一组非常详细的答案,并对规格有非常具体的参考
2赞 Antoine 3/14/2013
@StefanoBorini:谷歌搜索 CV-Qualifiers 的第二个结果是清晰而详尽的。根本不是一个蹩脚的论坛。
26赞 Stefano Borini 3/15/2013
@Antoine:有趣的是,人们仍然认为他们在谷歌中找到的东西就是其他人在谷歌中找到的东西。搜索结果是根据您的传统浏览行为量身定制的。这不是我的第二个结果。甚至没有第一页。事实上,我收到的主要是简历不合格的招聘公告。(可能是因为我六个月前找工作)

答:

69赞 Dirk Holsopple 3/14/2013 #1

如果某个类型没有任何 cv 限定符,则该类型为“cv-unqualified”。cv-qualifer 是 或 。constvolatile

5赞 Jerry Coffin 3/14/2013 #2

通常,它的意思是“相同的类型,但删除了任何 cv 限定符”,因此(例如)cv 的非限定版本将是 。void volatile * const xvoid *x

但是请注意,在这里,我将从指针本身及其指向的内容中删除 cv-qualifiers。在大多数情况下,一次只引用一个对象,因此指针本身的 cv 非限定版本仍然是 ,而它所指向的 cv 非限定版本将是 。cv-unqualifiedvoid volatile *xvoid *const x

24赞 Antoine 3/14/2013 #3

cv 代表 和 (更罕见的 ),这两个属性限定类型。您可以在 C++11 中使用等操作它们。constvolatilemutablestd::remove_const

优秀的cppreferences网站为您提供了更多信息

为了回答您的问题,cv-unqualified 类型要么没有,要么已从其 cv 限定符中删除。例如,是 的 cv 非限定部分。intconst volatile int

std::remove_cv<T>::type是 的 CV 不合格部分。T

评论

0赞 Stefano Borini 3/14/2013
我做到了,但它不在这里。我想要它在这里。
0赞 Antoine 3/14/2013
但事实确实如此!例如,这个问题是关于同一个主题的,但海报显示他做了一些研究来了解一些基础知识,但对一些特定的观点感到困惑。这就是我相信这个网站的精神。
8赞 Stefano Borini 3/15/2013
事实并非如此。问题的标题没有传达其内容。我希望任何有和我一样的问题的人去谷歌问“简历不合格是什么意思”,然后得到这个问题,在那里有明确的解释。顺便说一句,我认为 stackoverflow 社区针对合理但“认为容易”的问题的这种类似食人鱼的行为真的很令人讨厌,如果有替代方案,我已经切换了。让该死的人冷静下来
0赞 rayryeng 6/15/2023
@StefanoBorini我只想提一下,搜索把我带到了这里作为第一个结果。非常感谢您在这里为使其成为最高搜索结果所做的努力。再次感谢!cv unqualified C++
74赞 Joseph Mansfield 3/14/2013 #4

有基本类型和复合类型。基本类型是算术类型、 和 。复合类型包括数组、函数、指针、引用、类、联合、枚举和指向非静态成员的指针。voidstd::nullptr_t

cv-unqualified 类型是这些类型中的任何一种。

对于任何 cv 非限定类型,有三种对应的 cv 限定类型:

  • const-qualified - 使用 cv-qualifierconst
  • VALATILE-Qualified - 使用 CV-Qualifiervolatile
  • const-volatile-qualified - 同时使用 和 cv-qualifiersconstvolatile

但请注意,应用于数组类型的 cv 限定符实际上适用于其元素。

cv 合格类型和 cv 不合格类型是不同的。也就是说,与 是不同的类型。intconst int

评论

9赞 Chan Kim 6/2/2016
哇,我看不懂。.为什么它被命名为“CV-Unqualified”?如果你先告诉我们“这意味着什么”,然后再告诉我们“它是什么”会更好。当然,我现在知道 cv 是用于常量和易失性的。
1赞 Enlico 11/28/2018
为什么使用指针 [...] 和指向非静态成员的指针?后者不是包含在前者中吗?还是我错过了什么?
1赞 uvsmtid 5/17/2020
前两段不应该删除吗?如果我们简单地说“一个类型可以是 cv 合格的,也可以是 cv 不合格的”,那有什么区别呢?
0赞 Rogue 6/28/2022
“应用于数组类型的 cv-qualifiers applies to its elements”,这与 Java 等语言有很大不同,在 Java 中,它们适用于变量本身(而不是元素)!cppreference 还指出了这一设计决策:“数组类型被认为与其元素类型具有相同的 CV 限定。
13赞 LihO 3/14/2013 #5

cv-unqualified type 是任何 cv-qualifiers 都未指定的类型。它们定义了类型的两个基本属性:恒定性和挥发性。 参见 C++03 3.9.3 CV 限定符 §1:

3.9.1 和 3.9.2 中提到的类型是 cv 非限定类型。每个类型是 cv 非限定的完成或不完整的对象类型,或者是无效的 (3.9) 类型,其类型有三个相应的 cv 限定版本:

  • 符合 const 条件的版本,
  • 易失性限定版本,以及
  • 常量易失性限定版本。

术语对象类型 (1.8) 包括创建对象时指定的 cv 限定符。

如果 decl-specifier-seq 中存在 const 说明符,则声明 const 限定对象类型的对象;此类对象称为 const 对象

如果 decl-specifier-seq 中存在 volatile 说明符,则声明 volatilequalified 对象类型的对象;这种对象称为易失性对象

declspecifier-seq 中同时存在两个 cv 限定符,则声明一个 const-volatile-限定对象类型的对象;此类对象称为 const 易失性对象

4赞 Bhupesh Pant 5/20/2019 #6

我认为第一步是了解可能的类型和CV的含义:

const 和 volatile 出现在任何类型说明符中,包括声明语法的 decl-specifier-seq,以指定所声明对象或被命名类型的常量或波动性。

const - 定义类型为常量。

volatile - 定义类型为易失性。

解释

对于任何类型 T(包括不完整的类型),除了函数类型或引用类型之外,C++ 类型系统中还有三种不同的类型:常量限定 T、可变限定 T 和常量可变限定 T。

注意:数组类型被认为与其元素类型具有相同的 cv 限定。 首次创建对象时,使用的 cv 限定符(可以是 decl-specifier-seq 的一部分,也可以是声明中声明器的一部分,或者是 new-expression 中 type-id 的一部分)确定对象的恒定性或波动性,如下所示:

const 对象 - 类型为 const 限定的对象或 const 对象的不可变子对象。此类对象无法修改:尝试直接修改是编译时错误,尝试间接修改(例如,通过引用或指向非 const 类型的指针修改 const 对象)会导致未定义的行为。

volatile 对象 - 类型为 volatile-qualified 的对象,或者是 volatile 对象的子对象,或者是 const-volatile 对象的可变子对象。出于优化目的,通过可变限定类型的 glvalue 表达式进行的每次访问(读取或写入操作、成员函数调用等)都被视为可见的副作用(即,在单个执行线程中,可变性访问不能被优化或重新排序,而另一个可见的副作用是在可变性访问之前或之后排序的。这使得易失性对象适合与信号处理程序通信,但不适合与另一个执行线程通信,请参阅 std::memory_order)。任何试图通过非易失性左值(例如,通过引用或指向非易失性类型的指针)引用易失性对象都会导致未定义的行为。

const volatile object - an object whose type is const-volatile-qualified, a non-mutable subobject of a const volatile object, a const subobject of a volatile object, or a non-mutable volatile subobject of a const object. Behaves as both a const object and as a volatile object.

Ref: Cpp reference