有基本类型和复合类型。基本类型包括算术类型、void
和 std::nullptr_t
。复合类型包括数组、函数、指针、引用、类、联合、枚举和非静态成员指针。
未加cv限定的类型是上述所有类型中的任意一种。
对于任何未加const或volatile限定的类型,都有三种相应的cv限定类型:
const
cv限定符 volatile
cv限定符 const
和volatile
cv限定符但需要注意的是,应用于数组类型的cv限定符实际上适用于其元素。
带cv限定符和不带cv限定符的类型是不同的。即int
是与const int
不同的类型。
如果类型没有任何cv限定符,则为“cv-unqualified”类型。cv限定符可以是const
或volatile
CV代表着const和volatile(较少用到mutable),是用来修饰类型的两个属性。在C++11中,您可以使用std::remove_const等函数来操作它们。
优秀的cppreference网站为您提供更多信息。
回答您的问题,cv-unqualified类型要么没有cv限定符,要么被剥离了它们。例如,int是const volatile int的cv-unqualified部分。
std::remove_cv<T> ::type是T的cv-unqualified部分。
在3.9.1和3.9.2中提到的类型是 cv-unqualified type。每种类型都有三个相应的带有cv限定符的版本:
- 一个 const-qualified 版本,
- 一个 volatile-qualified 版本,以及
- 一个 const-volatile-qualified 版本。
对象类型(1.8)的术语包括创建对象时指定的cv限定符。
在 decl-specifier-seq 中存在
const
说明符,则声明一个 const-qualified 对象类型的对象;此类对象称为const object
。在 decl-specifier-seq 中存在
volatile
说明符,则声明一个 volatile-qualified 对象类型的对象;此类对象称为volatile object
。在 decl-specifier-seq 中存在两个 cv 限定符,则声明一个 const-volatile-qualified 对象类型的对象;此类对象称为
const volatile object
。
void volatile * const x
的非cv限定版本将是void *x
。void volatile *x
,而它所指向的内容的无cv限定版本将是void *const x
。我认为第一步是了解可能的类型和CV的含义:
const 和 volatile 出现在任何类型说明符中,包括声明语法的 decl-specifier-seq,用于指定所声明的对象或所命名类型的常量性或易变性。
const - 定义类型是常量。
volatile - 定义类型是易变的。
说明
对于除函数类型或引用类型之外的任何类型 T(包括不完全类型),C++ 类型系统中还有三种更具体的类型:const 限定的 T、volatile 限定的 T 和 const-volatile 限定的 T。
注意:数组类型被视为具有与其元素类型相同的 CV 限定。当对象首次创建时,CV 限定符(可以是声明或 type-id 中的 decl-specifier-seq 或 declarator 的一部分)确定对象的常量性或易变性,如下所示:
const 对象 - 类型为 const 限定或 const 对象的非可变子对象。这样的对象无法修改:直接尝试修改会导致编译时错误,通过引用或指向非 const 类型的指针间接地修改 const 对象会导致未定义行为。
volatile 对象 - 类型为 volatile 限定或 volatile 对象的子对象,或 const-volatile 对象的可变子对象。通过 volatile 限定类型的 glvalue 表达式进行的每个访问(读取或写入操作、成员函数调用等)都被视为优化目的的可见副作用(也就是说,在单个执行线程内,volatile 访问不能被优化掉或与其他序列化在 volatile 访问之前或之后的可见副作用重新排序。这使得 volatile 对象适合与信号处理程序通信,但不适合与另一个执行线程通信,参见 std::memory_order)。任何试图通过非 volatile 左值引用(例如通过指向非 volatile 类型的引用或指针)引用 volatile 对象的尝试都会导致未定义行为。
const volatile 对象 - 类型为 const-volatile 限定、const volatile 对象的非可变子对象、volatile 对象的 const 子对象或 const 对象的非可变 volatile 子对象。行为既像 const 对象又像 volatile 对象。
参考:Cpp reference