件名からのように。最近の質問でこの用語を見ましたが、明らかに確立された用語ですが、stackoverflow で何も見つけることができません。
6 に答える
基本型と複合型があります。基本型は算術型、void
、およびstd::nullptr_t
です。複合型は、配列、関数、ポインター、参照、クラス、共用体、列挙、および非静的メンバーへのポインターです。
cv 非修飾型は、これらの型のいずれかです。
cv 修飾されていない型には、対応する 3 つのcv 修飾された型があります。
- const 修飾-
const
cv 修飾子を使用 - volatile-qualified -
volatile
cv-qualifier を使用 - const-volatile-qualified
const
-とvolatile
cv-qualifierの両方を使用
ただし、配列型に適用される cv 修飾子は、実際にはその要素に適用されることに注意してください。
cv 修飾された型と cv 修飾されていない型は異なります。これはint
とは異なるタイプですconst int
。
cv 修飾子がない場合、型は「cv 非修飾」です。cv-qualifer は または のいずれconst
かvolatile
です。
cvは、const
およびvolatile
(まれmutable
に)、タイプを修飾する2つの属性を表します。std::remove_const
C++11などで操作できます。
優れたcppreferenceサイトはあなたにもっと多くの情報を与えます。
あなたの質問に答えるために、cv-unqualifiedタイプは、cv-qualifiersを持たないか、cv-qualifiersから削除されます。たとえばint
、のcv-unqualified部分ですconst volatile int
。
std::remove_cv<T>::type
はcv-unqualifiedpartofT
です。
cv-unqualifiedタイプは、 cv-qualifiersのいずれによっても指定されていないタイプです。これらは、タイプの2つの基本的なプロパティを定義します:恒常性とボラティリティ。C ++ 03 3.9.3 CV-qualifiers§1を参照してください
3.9.1および3.9.2で言及されているタイプは、cv非修飾タイプです。cv-unqualifiedの完全または不完全なオブジェクトタイプであるか、void(3.9)である各タイプには、そのタイプの3つの対応するcv-qualifiedバージョンがあります。
- const修飾バージョン、
- 揮発性修飾バージョン、および
- const-volatile-qualifiedバージョン。
オブジェクトタイプ(1.8)という用語には、オブジェクトの作成時に指定されたcv修飾子が含まれます。
const
decl-specifier-seqに指定子が存在すると、const修飾オブジェクト型のオブジェクトが宣言されます。このようなオブジェクトはと呼ばれますconst object
。
volatile
decl-specifier-seqに指定子が存在すると、volatilequalifiedオブジェクト型のオブジェクトが宣言されます。このようなオブジェクトはと呼ばれますvolatile object
。declspecifier-seqに両方のcv-qualifiersが存在すると、const-volatile-qualifiedオブジェクトタイプのオブジェクトが宣言されます。このようなオブジェクトはと呼ばれます
const volatile object
。
一般に、「同じ型ですが、cv-qualifier が削除されている」ことを意味するため、(たとえば) の cv-unqualified バージョンvoid volatile * const x
はvoid *x
.
ただし、ここでは、ポインター自体とポインターが指すものの両方から cv 修飾子を削除していることに注意してください。ほとんどの場合、cv-unqualified
は一度に 1 つのオブジェクトのみを参照するため、ポインター自体の cv 修飾されていないバージョンは依然として になりますが、ポインターが指すものの cv 修飾されていないバージョンは にvoid volatile *x
なりますvoid *const x
。