65

从主题。我在最近提出的一个问题中看到了这个术语,显然这是一个成熟的术语,但我在 stackoverflow 上找不到任何东西。

4

6 回答 6

63

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

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

对于任何 cv-unqualified 类型,都有 3 个对应的 cv-qualified类型:

  • const-qualified - 带有constcv 限定符
  • volatile-qualified - 带有volatilecv 限定符
  • const-volatile-qualified - 同时具有 theconstvolatilecv 限定符

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

cv-qualified 和 cv-unqualified 类型是不同的。那是intconst int.

于 2013-03-14T15:21:08.900 回答
56

如果一个类型没有任何 cv 限定符,则它是“cv-unqualified”。cv 限定符是constvolatile

于 2013-03-14T15:15:23.757 回答
13

cv 代表constand volatile(并且很少见mutable),两个属性限定一个类型。您可以std::remove_const在 C++11 中使用等操作它们。

优秀的 cppreference 站点为您提供更多信息。

要回答您的问题,cv 不合格类型要么没有,要么已从其 cv 限定符中删除。例如int是 的 cv 不合格部分const volatile int

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

于 2013-03-14T15:18:08.827 回答
12

cv-unqualified 类型是尚未由任何cv-qualifiers指定的类型。它们定义了一个类型的两个基本属性: constnessVolatility。参见C++03 3.9.3 CV-qualifiers §1:

3.9.1 和 3.9.2 中提到的类型是cv-unqualified type。每个类型是 cv 非限定的完整或不完整对象类型或 void (3.9) 具有其类型的三个对应的 cv 限定版本:

  • 一个const 限定的版本,
  • 一个volatile 限定的版本,和
  • 一个const-volatile 限定的版本。

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

constdecl-specifier-seq 中的说明符的存在声明了一个const 限定对象类型的对象;这样的对象称为 a const object

volatiledecl-specifier-seq 中指定符的存在声明了一个volatilequalified对象类型的对象;这样的对象称为 a volatile object

declspecifier-seq 中两个 cv 限定符的存在声明了一个const-volatile 限定对象类型的对象;这样的对象称为 a const volatile object

于 2013-03-14T15:26:46.873 回答
4

通常它的意思是“相同的类型,但删除了任何 cv-qualifier”,所以(例如) cv-unqualified 版本void volatile * const x将是void *x.

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

于 2013-03-14T15:16:33.100 回答
3

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

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

const - 定义类型是常量。

volatile - 定义类型为 volatile。

解释

对于任何类型 T(包括不完整类型),除了函数类型或引用类型,C++ 类型系统中还有另外三种不同的类型:const-qualified T、volatile-qualified T 和 const-volatile-qualified T。

注意:数组类型被认为具有与其元素类型相同的 cv 限定。首次创建对象时,使用的 cv 限定符(可能是 decl-specifier-seq 的一部分或声明中的声明符的一部分或 new 表达式中的 type-id 的一部分)确定对象的常量或易变性对象,如下:

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

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

const volatile 对象- 类型为 const-volatile 限定的对象、const volatile 对象的非可变子对象、volatile 对象的 const 子对象或 const 对象的非可变 volatile 子对象。既可以作为 const 对象,也可以作为 volatile 对象。

参考:Cpp 参考

于 2019-05-20T14:55:04.170 回答