提问人:Stefano Borini 提问时间:3/14/2013 最后编辑:Sabito stands with UkraineStefano Borini 更新时间:11/23/2023 访问量:14305
C++ 中的“cv-unqualified”是什么意思?
What does "cv-unqualified" mean in C++?
答:
如果某个类型没有任何 cv 限定符,则该类型为“cv-unqualified”。cv-qualifer 是 或 。const
volatile
通常,它的意思是“相同的类型,但删除了任何 cv 限定符”,因此(例如)cv 的非限定版本将是 。void volatile * const x
void *x
但是请注意,在这里,我将从指针本身及其指向的内容中删除 cv-qualifiers。在大多数情况下,一次只引用一个对象,因此指针本身的 cv 非限定版本仍然是 ,而它所指向的 cv 非限定版本将是 。cv-unqualified
void volatile *x
void *const x
cv 代表 和 (更罕见的 ),这两个属性限定类型。您可以在 C++11 中使用等操作它们。const
volatile
mutable
std::remove_const
优秀的cppreferences网站为您提供了更多信息。
为了回答您的问题,cv-unqualified 类型要么没有,要么已从其 cv 限定符中删除。例如,是 的 cv 非限定部分。int
const volatile int
std::remove_cv<T>::type
是 的 CV 不合格部分。T
评论
cv unqualified C++
有基本类型和复合类型。基本类型是算术类型、 和 。复合类型包括数组、函数、指针、引用、类、联合、枚举和指向非静态成员的指针。void
std::nullptr_t
cv-unqualified 类型是这些类型中的任何一种。
对于任何 cv 非限定类型,有三种对应的 cv 限定类型:
- const-qualified - 使用 cv-qualifier
const
- VALATILE-Qualified - 使用 CV-Qualifier
volatile
- const-volatile-qualified - 同时使用 和 cv-qualifiers
const
volatile
但请注意,应用于数组类型的 cv 限定符实际上适用于其元素。
cv 合格类型和 cv 不合格类型是不同的。也就是说,与 是不同的类型。int
const int
评论
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 易失性对象
。
我认为第一步是了解可能的类型和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
评论