"cv-unqualified" C++是什么意思?

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

本文关键字:意思 C++ cv-unqualified 是什么      更新时间:2023-10-16

来自主题。我在最近提出的一个问题中看到这个术语,显然这是一个成熟的术语,但我无法在堆栈溢出上找到任何内容。

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

CV 不合格类型是这些类型中的任何一种。

对于任何不符合 cv 标准的类型,有三种相应的 cv 合格类型:

  • 符合 CONST 标准 - 符合 const CV 资格
  • 挥发性合格 - 使用 volatile CV 合格
  • 符合常量挥发性标准 - 同时符合 constvolatile CV 资格

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

符合 cv 和不符合 cv 标准的类型是不同的。也就是说int是与const int不同的类型。

如果类型没有任何 cv 限定符,则类型为"cv-unqualified"。简历是constvolatile

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

优秀的cpp偏好网站为您提供更多信息。

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

std::remove_cv<T>::typeT的简历不合格部分。

cv-unqualified 类型是尚未由任何 cv 限定符指定的类型。这些定义了类型的两个基本属性:恒常性和波动性。参见C++03 3.9.3 CV限定符§1:

3.9.1

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

  • 符合恒量标准的版本,
  • 失性限定版本,以及
  • 常量易失性限定版本。

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

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

在 decl-specifier-seq 中存在volatile说明符声明了易失性对象类型的对象;这种对象称为volatile object

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

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

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

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

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

const - 定义类型是常量。

易失性 - 定义类型是易失性的。

解释

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

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

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

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

const volatile 对象 - 类型为常量易失性限定的对象、常量易失性对象的不可变子对象、易失性对象的常量子对象

或常量对象的不可变易失性子对象。表现为常量对象和易失性对象。

参考:CPP 参考