値に型がないというトピック、記事、およびSOの回答を読みまし#define
た。型は値自体のプロパティではなく、コンテナー変数のプロパティであると考えて、この概念について決心しました。
const char cVALUE = 100; // 'cVALUE' is char with value 100, wich type is '100'?
const short sVALUE = 100; // 'sVALUE' is short with value 100, wich type is '100'?
const int iVALUE = 100; // 'iVALUE' is int with value 100, wich type is '100'?
#define VALUE 100 // wich type is 'VALUE'?
しかし、値の接尾辞はどうですか?
#define VALUE_L 100l // 'VALUE_L' is long?
#define VALUE_UL 100ul // 'VALUE_UL' is unsigned long?
#define VALUE_LL 100ll // 'VALUE_LL' is long long?
#define VALUE_ULL 100ull // 'VALUE_ULL' is unsigned long long?
上記のコードでは、型が値に関連付けられているように見えるため、以前に読んだものとは対照的に、この生の値はすべて型付きの値です。しかし、もっとあります!テキスト リテラルには修飾子もあります。次に例を示します。
#define TEXT "Text" // '"Text"' is an array of some kind of chars.
上記のテキスト値に#define
はタイプがあります (文字タイプ、MSVC を使用している場合、プロジェクト設定を変更すると文字タイプが異なる可能性があると思います -> Character set、別の IDE で可能かどうかはわかりません)。 cualifier であり、const
それが RValue ではなく LValue である場合、数値リテラルとテキスト リテラルの間のこのすべての動作の違いが気になります。
したがって、文字タイプがchar
であるとすると、リテラルのタイプ"Text"
はconst char *
、const char * const
またはconst char[5]
? または、少なくとも、コンテキストで正しい型が推定される前に型がまったくありませんか?
また、C++11 標準では、文字セットを設定するいくつかのプレフィックスを使用して、テキスト リテラルに型を指定することもできます。
#define TEXT L"Text" // wide string with char type wchar_t
#define TEXTu8 u8"Text" // UTF-8 string with char type char
#define TEXTu u"Text" // UTF-16 string with char type char16_t
#define TEXTU U"Text" // UTF-32 string with char type char32_t
これらすべてのことを考えた後、私はかなり混乱しているので、アドバイスを求めています。
- リテラル値 (および
#define
s) には型がなく、リテラルで型を指定できるという一般的な知識があるのはなぜですか? つまり、値リテラルに型がないことをアサートするのは false ですか? - 接尾辞も小数部もない値リテラル( など
100
) は、常に int 型と見なすことができますか? - 接頭辞を考慮しても、テキストリテラルの型と修飾子はどれですか?