从主题。我在最近提出的一个问题中看到了这个术语,显然这是一个成熟的术语,但我在 stackoverflow 上找不到任何东西。
6 回答
有基本类型和复合类型。基本类型是算术类型void
、 和std::nullptr_t
。复合类型是数组、函数、指针、引用、类、联合、枚举和指向非静态成员的指针。
cv-unqualified类型是这些类型中的任何一种。
对于任何 cv-unqualified 类型,都有 3 个对应的 cv-qualified类型:
- const-qualified - 带有
const
cv 限定符 - volatile-qualified - 带有
volatile
cv 限定符 - const-volatile-qualified - 同时具有 the
const
和volatile
cv 限定符
但是请注意,应用于数组类型的 cv 限定符实际上应用于其元素。
cv-qualified 和 cv-unqualified 类型是不同的。那是int
与const int
.
如果一个类型没有任何 cv 限定符,则它是“cv-unqualified”。cv 限定符是const
或volatile
。
cv 代表const
and volatile
(并且很少见mutable
),两个属性限定一个类型。您可以std::remove_const
在 C++11 中使用等操作它们。
优秀的 cppreference 站点为您提供更多信息。
要回答您的问题,cv 不合格类型要么没有,要么已从其 cv 限定符中删除。例如int
是 的 cv 不合格部分const volatile int
。
std::remove_cv<T>::type
是 cv 不合格的部分T
。
cv-unqualified 类型是尚未由任何cv-qualifiers指定的类型。它们定义了一个类型的两个基本属性: constness和Volatility。参见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 限定符。
const
decl-specifier-seq 中的说明符的存在声明了一个const 限定对象类型的对象;这样的对象称为 aconst object
。
volatile
decl-specifier-seq 中指定符的存在声明了一个volatilequalified对象类型的对象;这样的对象称为 avolatile object
。declspecifier-seq 中两个 cv 限定符的存在声明了一个const-volatile 限定对象类型的对象;这样的对象称为 a
const volatile object
。
通常它的意思是“相同的类型,但删除了任何 cv-qualifier”,所以(例如) cv-unqualified 版本void volatile * const x
将是void *x
.
但是请注意,在这里,我从指针本身及其指向的内容中删除了 cv 限定符。在大多数情况下,cv-unqualified
一次只引用一个对象,因此指针本身的 cv 不合格版本仍然是void volatile *x
,而指针指向的内容的 cv 不合格版本将是void *const x
。
我认为第一步是了解可能的类型和 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 参考