const
とC仕様によってvolatile
呼び出されます。cv-qualifier
specifier
とqualifier
( )の正確な違いは何cv-qualifier
ですか?修飾子は指定子でもありますか?
qualifier
左辺値のみの場合は必要ですか?
以外の修飾子は何cv-qualifier
ですか?
私の上記の理解は意味がありますか?
そのほとんどは意味がありません。
指定子と修飾子はC++標準で定義されています。修飾子は、指定子の不可欠な部分にすぎません。たとえば、宣言の型指定子にはcv-qualifiersを含めることができます。このトピックに関する標準からすべてを引用する理由はわかりません。
Cv修飾子は左辺値に制限されていません。クラスタイプの右辺値もcv修飾できます。非クラス型の右辺値をcv修飾することは可能ですが、効果がなく無視されます。
const
例で示す修飾子の使用foo
は単なる構文形式です。これは、実際には、const-qualifierがメソッドの暗黙this
のパラメーターに適用されることを意味します。つまり、この場合、それは確かに左辺値を修飾しますが、そうではありません。foo
const A* this
*this
foo
修飾子という用語は、修飾名のコンテキストでも表示されます。some_class::some_member
(またはsome_namespace::some_name
)のような名前は修飾名と呼ばれ、そのsome_class::
部分は修飾子です。
何かが左辺値である場合、それを変更できるという考えは完全に間違っています。変更可能な左辺値と変更不可能な左辺値があります。として宣言されたオブジェクトはconst int i = 5
左辺値ですが、変更することはできません。通常の関数もC++の左辺値ですが、関数を変更することはできません。
cv-qualifierは指定子であり、実際には型指定子です。
C ++ 03 7.1の引用:
宣言で使用できる指定子は次のとおりです。
decl-specifier:
storage-class-specifier
type-specifier
function-specifier
friend
typedef
decl-specifier-seq:
decl-specifier-seq_opt
decl-specifier
...型指定子が定義されている間:
type-specifier:
simple-type-specifier
class-specifier
enum-specifier
elaborated-type-specifier
cv-qualifier
単語指定子と修飾子の違いについては、次のとおりです。
cv-unqualifiedの完全または不完全なオブジェクトタイプであるかvoidである各タイプには、そのタイプの3つの対応するcv-qualifiedバージョンがあります:const-qualifiedバージョン、volatile-qualifiedバージョン、およびconst-volatile-qualifiedバージョン。オブジェクトタイプという用語には、オブジェクトの作成時に指定されたcv修飾子が含まれます。decl-specifier-seqにconst指定子が存在すると、const修飾オブジェクト型のオブジェクトが宣言されます。このようなオブジェクトは、constオブジェクトと呼ばれます。decl-specifier-seqに揮発性指定子が存在すると、揮発性修飾オブジェクト型のオブジェクトが宣言されます。このようなオブジェクトは、揮発性オブジェクトと呼ばれます。decl-specifier-seqに両方のcv修飾子が存在する const-volatile-qualifiedオブジェクトタイプのオブジェクトを宣言します。このようなオブジェクトは、constvolatileオブジェクトと呼ばれます。タイプのcv修飾バージョンまたはcv非修飾バージョンは別個のタイプです。ただし、それらは同じ表現と配置の要件を持つものとします。
明確に述べられていませんが、上の段落は違いを示しています。ただし、定義はもっと厳密になる可能性があることを認めます。