“cv-unqualified”在C ++中意味着什么?

时间:2013-03-14 15:12:03

标签: c++

来自主题。我在最近问的一个问题中看到了这个术语,显然这是一个很好的术语,但我无法在stackoverflow上找到任何东西。

6 个答案:

答案 0 :(得分:37)

类型是" cv-unqualified"如果它没有任何cv限定符。 cv-qualifer是constvolatile

答案 1 :(得分:35)

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

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

对于任何cv-nonqualified类型,有三种相应的 cv-qualified 类型:

  • const-qualified - 使用const cv-qualifier
  • volatile-qualified - 使用volatile cv-qualifier
  • const-volatile-qualified - 同时使用constvolatile cv-qualifiers

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

cv-qualified和cv-nonqualified类型是不同的。这是intconst int不同的类型。

答案 2 :(得分:9)

cv-unqualified type cv-qualifiers 中未指定的类型。这些定义了类型的两个基本属性: constness 波动率 。 参见 C ++ 03 3.9.3 CV-qualifiers§1:

  

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

     
      
  • const-qualified 版本,
  •   
  • volatile-qualified 版本和
  •   
  • const-volatile-qualified 版本。
  •   
     

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

     

在decl-specifier-seq中存在 const 说明符声明了 const-qualified 对象类型的对象;此类对象称为 const object

     

在decl-specifier-seq中存在 volatile 说明符会声明 volatilequalified 对象类型的对象;此类对象称为 volatile object

     

在declspecifier-seq中存在两个cv-qualifiers声明了一个 const-volatile-qualified 对象类型的对象;此类对象称为 const volatile object

答案 3 :(得分:7)

cv代表constvolatile(更少见mutable),两个属性符合类型。您可以使用C ++ 11中的std::remove_const等来操作它们。

优秀的cppreference网站gives you more信息。

要回答你的问题,cv-unqualified类型要么没有,要么从cv-qualifiers中删除。例如intconst volatile int的cv不合格部分。

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

答案 4 :(得分:3)

通常它意味着“相同的类型,但删除了任何cv-qualifier”,因此(例如)void volatile * const x的cv-nonqualified版本将为void *x

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

答案 5 :(得分:0)

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

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

const -定义类型为常量。

易失性-定义类型为易失性。

说明

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

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

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

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

const volatile对象-类型为const-volatile限定的对象,const volatile对象的非可变子对象,volatile对象的const子对象或volatile的非可变volatile const对象的子对象。既表现为const对象又表现为volatile对象。

参考:Cpp参考