Character literal
目次 |
構文
'
c-char
'
|
(1) | ||||||||
u8'
c-char
'
|
(2) | (C++17以降) | |||||||
u'
c-char
'
|
(3) | (C++11以降) | |||||||
U'
c-char
'
|
(4) | (C++11以降) | |||||||
L'
c-char
'
|
(5) | ||||||||
'
c-char-sequence
'
|
(6) | ||||||||
L'
c-char-sequence
'
|
(7) | (C++23まで) | |||||||
| c-char | - |
以下のいずれか
|
| basic-c-char | - | basic source character set (until C++23) translation character set (since C++23) からの文字。ただしシングルクォート ' 、バックスラッシュ \ 、改行文字は除く |
| c-char-sequence | - | 2つ以上の c-char の連続 |
説明
エンコード不可能な文字
| (until C++23) |
数値エスケープシーケンス
数値(8進数および16進数)エスケープシーケンスは、文字の値を指定するために使用できます。
|
文字リテラルが数値エスケープシーケンスを1つだけ含み、かつエスケープシーケンスによって指定された値がその型の符号なしバージョンで表現可能な場合、文字リテラルは指定された値と同じ値を持つ(文字型への変換後である可能性がある)。 UTF- N 文字リテラルは、その型で表現可能な任意の値を持つことができる。値が有効なUnicodeコードポイントに対応していない場合、または対応するコードポイントがUTF- N で単一のコード単位として表現できない場合でも、その値を持つ数値エスケープシーケンスで指定することができる。例: u8 ' \xff ' は整形式であり、 char8_t ( 0xFF ) と等しい。 |
(C++23以降) |
|
通常文字リテラルまたはワイド文字リテラルで使用される数値エスケープシーケンスによって指定された値が、 char または wchar_t でそれぞれ表現できない場合、文字リテラルの値は実装定義である。 |
(C++23まで) |
|
1つの c-char を持つ通常文字リテラルまたはワイド文字リテラルで使用される数値エスケープシーケンスによって指定された値が、 char または wchar_t のそれぞれの基づく型の符号なしバージョンで表現可能な場合、リテラルの値はその符号なし整数型の整数値であり、指定された値はリテラルの型に変換される。そうでない場合、プログラムは不適格である。 |
(C++23から) |
|
UTF-
N
文字リテラルで使用される数値エスケープシーケンスによって指定された値が、対応する
|
(C++11以降) |
注記
マルチキャラクターリテラルはBプログラミング言語からCに継承されました。CまたはC++標準で規定されていませんが、ほとんどのコンパイラ(MSVCは顕著な例外)はBで規定された通りにマルチキャラクターリテラルを実装しています:リテラル内の各charの値が、ビッグエンディアンのゼロパディング右揃え順で結果の整数の連続するバイトを初期化します。例えば、 ' \1 ' の値は 0x00000001 であり、 ' \1 \2 \3 \4 ' の値は 0x01020304 です。
C言語では、 'a' や ' \n ' といった文字定数は、 char ではなく int 型を持ちます。
例
#include <cstdint> #include <iomanip> #include <iostream> #include <string_view> template<typename CharT> void dump(std::string_view s, const CharT c) { const uint8_t* data{reinterpret_cast<const uint8_t*>(&c)}; std::cout << s << " \t" << std::hex << std::uppercase << std::setfill('0'); for (auto i{0U}; i != sizeof(CharT); ++i) std::cout << std::setw(2) << static_cast<unsigned>(data[i]) << ' '; std::cout << '\n'; } void print(std::string_view str = "") { std::cout << str << '\n'; } int main() { print("Ordinary character literals:"); char c1 = 'a'; dump("'a'", c1); char c2 = '\x2a'; dump("'*'", c2); print("\n" "Ordinary multi-character literals:"); int mc1 = 'ab'; dump("'ab'", mc1); // implementation-defined int mc2 = 'abc'; dump("'abc'", mc2); // implementation-defined print("\n" "UTF-8 character literals:"); char8_t C1 = u8'a'; dump("u8'a'", C1); // char8_t C2 = u8'¢'; dump("u8'¢'", C2); // error: ¢ maps to two UTF-8 code units // char8_t C3 = u8'猫'; dump("u8'猫'", C3); // error: 猫 maps to three UTF-8 code units // char8_t C4 = u8'🍌'; dump("u8'🍌'", C4); // error: 🍌 maps to four UTF-8 code units print("\n" "UTF-16 character literals:"); char16_t uc1 = u'a'; dump("u'a'", uc1); char16_t uc2 = u'¢'; dump("u'¢'", uc2); char16_t uc3 = u'猫'; dump("u'猫'", uc3); // char16_t uc4 = u'🍌'; dump("u'🍌'", uc4); // error: 🍌 maps to two UTF-16 code units print("\n" "UTF-32 character literals:"); char32_t Uc1 = U'a'; dump("U'a'", Uc1); char32_t Uc2 = U'¢'; dump("U'¢'", Uc2); char32_t Uc3 = U'猫'; dump("U'猫'", Uc3); char32_t Uc4 = U'🍌'; dump("U'🍌'", Uc4); print("\n" "Wide character literals:"); wchar_t wc1 = L'a'; dump("L'a'", wc1); wchar_t wc2 = L'¢'; dump("L'¢'", wc2); wchar_t wc3 = L'猫'; dump("L'猫'", wc3); wchar_t wc4 = L'🍌'; dump("L'🍌'", wc4); // unsupported on Windows since C++23 }
出力例:
Ordinary character literals: 'a' 61 '*' 2A Ordinary multi-character literals: 'ab' 62 61 00 00 'abc' 63 62 61 00 UTF-8 character literals: u8'a' 61 UTF-16 character literals: u'a' 61 00 u'¢' A2 00 u'猫' 2B 73 UTF-32 character literals: U'a' 61 00 00 00 U'¢' A2 00 00 00 U'猫' 2B 73 00 00 U'🍌' 4C F3 01 00 Wide character literals: L'a' 61 00 00 00 L'¢' A2 00 00 00 L'猫' 2B 73 00 00 L'🍌' 4C F3 01 00
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用バージョン | 公開時の仕様 | 正しい仕様 |
|---|---|---|---|
| CWG 912 | C++98 | エンコード不可能な通常文字リテラルの扱いが未規定 | 条件付きサポートとして規定 |
| CWG 1024 | C++98 | マルチキャラクタリテラルのサポートが必須 | 条件付きサポートに変更 |
| CWG 1656 | C++98 |
文字リテラル内の数値エスケープシーケンスの
意味が不明確 |
明確に規定 |
| P1854R4 | C++98 | エンコード不可能な文字リテラルが条件付きサポート | プログラムが不適格 |
参考文献
- C++23標準 (ISO/IEC 14882:2024):
-
- 5.13.3 文字リテラル [lex.ccon]
- C++20標準 (ISO/IEC 14882:2020):
-
- 5.13.3 文字リテラル [lex.ccon]
- C++17 標準 (ISO/IEC 14882:2017):
-
- 5.13.3 文字リテラル [lex.ccon]
- C++14標準 (ISO/IEC 14882:2014):
-
- 2.14.3 文字リテラル [lex.ccon]
- C++11標準 (ISO/IEC 14882:2011):
-
- 2.14.3 文字リテラル [lex.ccon]
- C++03規格 (ISO/IEC 14882:2003):
-
- 2.13.2 文字リテラル [lex.ccon]
- C++98 標準 (ISO/IEC 14882:1998):
-
- 2.13.2 文字リテラル [lex.ccon]
関連項目
| ユーザー定義リテラル (C++11) | ユーザー定義サフィックスを持つリテラル |
|
Cドキュメント
for
文字定数
|
|