Namespaces
Variants

Character literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

目次

構文

' 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 の連続

説明

1) 通常の文字リテラル、例: 'a' または ' \n ' または ' \13 ' 。このようなリテラルは char 型を持ち、その値は c-char 実行文字セット における表現 (C++23まで) 通常リテラルエンコーディング からの対応するコードポイント (C++23以降) に等しい。
2) UTF-8文字リテラル、例: u8 'a' 。このようなリテラルは型 char (C++20まで) char8_t (C++20以降) を持ち、値は ISO/IEC 10646 のコードポイント値に等しい。ただし、コードポイント値が単一のUTF-8コード単位で表現可能な場合(つまり、 c-char が0x0-0x7Fの範囲内にある場合)に限る。
3) UTF-16 文字リテラル、例: u '猫' 、ただし u '🍌' ( u ' \U0001f34c ' ) は不可。このようなリテラルは char16_t 型を持ち、その値は ISO/IEC 10646 のコードポイント値に等しい。ただし、コードポイント値が単一のUTF-16コード単位で表現可能な場合(つまり c-char が 0x0-0xFFFF の範囲内にある場合)に限る。
4) UTF-32 文字リテラル、例: U '猫' または U '🍌' 。このようなリテラルは char32_t 型を持ち、その値は ISO/IEC 10646 c-char のコードポイント値に等しい。
5) ワイド文字リテラル、例: L 'β' または L '猫' 。このようなリテラルは wchar_t 型を持ち、その値は 実行ワイド文字セットにおける c-char の値 (C++23まで) ワイドリテラルエンコーディングからの対応するコードポイント (C++23以降) に等しい。
6) 通常のマルチキャラクタリテラル (C++23まで) マルチキャラクタリテラル (C++23以降) 、例えば 'AB' は、条件付きでサポートされ、型は int を持ち、実装定義の値を持つ。
7) ワイドマルチキャラクターリテラル、例えば L 'AB' は、条件付きでサポートされ、 wchar_t 型を持ち、実装定義の値を持つ。

エンコード不可能な文字

1-5) 以下の場合、 c-char が数値エスケープシーケンスではない(下記参照)とき、 c-char がリテラルの関連文字エンコーディングで表現不可能であるか、そのエンコーディングで単一のコード単位としてエンコードできない場合(例:Windowsで wchar_t が16ビットの場合の非BMP値)、プログラムは不適格となる。
6) もし c-char-sequence 内のいずれかの c-char ordinary literal encoding で単一のコード単位としてエンコードできない場合、プログラムは不適格となる。
7) c-char-sequence 内のいずれかの c-char wide literal encoding の単一コード単位としてエンコードできない場合、プログラムは不適格となる。
(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 文字リテラルで使用される数値エスケープシーケンスによって指定された値が、対応する char N _t で表現できない場合、 文字リテラルの値は実装定義である (C++17まで) プログラムは不適格である (C++17以降)

(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 文字定数