C++ はさまざまな文字列と文字型をサポートし、これらの型のリテラル値を表す方法を提供しています。 ソース コードでは、文字セットを使用して文字リテラルと文字列リテラルの内容を表現します。 ユニバーサル文字名とエスケープ文字を使用すると、基本ソース文字セットのみを使用してあらゆる文字列を表現できます。 未加工文字列リテラルを使用すると、エスケープ文字の使用を避けられるとともに、全種類の文字列リテラルを表すことができます。 std::stringまた、追加の構築や変換の手順を実行することなく、リテラルを作成することもできます。
#include <string> using namespace std::string_literals; // enables s-suffix for std::string literals int main() { // Character literals auto c0 = ‘A’; // char auto c1 = u8’A’; // char auto c2 = L’A’; // wchar_t auto c3 = u’A’; // char16_t auto c4 = U’A’; // char32_t // Multicharacter literals auto m0 = ‘abcd’; // int, value 0x61626364 // String literals auto s0 = “hello”; // const char* auto s1 = u8″hello”; // const char* before C++20, encoded as UTF-8, // const char8_t* in C++20 auto s2 = L”hello”; // const wchar_t* auto s3 = u”hello”; // const char16_t*, encoded as UTF-16 auto s4 = U”hello”; // const char32_t*, encoded as UTF-32 // Raw string literals containing unescaped and ” auto R0 = R”(“Hello world”)”; // const char* auto R1 = u8R”(“Hello world”)”; // const char* before C++20, encoded as UTF-8, // const char8_t* in C++20 auto R2 = LR”(“Hello world”)”; // const wchar_t* auto R3 = uR”(“Hello world”)”; // const char16_t*, encoded as UTF-16 auto R4 = UR”(“Hello world”)”; // const char32_t*, encoded as UTF-32 // Combining string literals with standard s-suffix auto S0 = “hello”s; // std::string auto S1 = u8″hello”s; // std::string before C++20, std::u8string in C++20 auto S2 = L”hello”s; // std::wstring auto S3 = u”hello”s; // std::u16string auto S4 = U”hello”s; // std::u32string // Combining raw string literals with standard s-suffix auto S5 = R”(“Hello world”)”s; // std::string from a raw const char* auto S6 = u8R”(“Hello world”)”s; // std::string from a raw const char* before C++20, encoded as UTF-8, // std::u8string in C++20 auto S7 = LR”(“Hello world”)”s; // std::wstring from a raw const wchar_t* auto S8 = uR”(“Hello world”)”s; // std::u16string from a raw const char16_t*, encoded as UTF-16 auto S9 = UR”(“Hello world”)”s; // std::u32string from a raw const char32_t*, encoded as UTF-32 }
文字列リテラルには、プレフィックスを指定することはできません。また、、、 u8L 、およびプレフィックスを使用して、 uU ナロー文字 (1 バイトまたは複数バイト)、utf-8、ワイド文字 (UCS-2 または utf-16)、utf-16、および 32 utf-8 エンコーディングを示すこともできます。 未加工の文字列リテラルでは R 、 u8RLRuRUR これらのエンコーディングの未加工バージョンに相当する、、、、、およびプレフィックスを使用できます。 一時値または静的な値を作成するには std::string 、文字列リテラルまたは未加工の文字列リテラルをサフィックスと共に使用し s ます。 詳細については、後述する「 文字列リテラル 」を参照してください。 基本ソース文字セット、ユニバーサル文字名、ソースコードの拡張コードページからの文字の使用の詳細については、「 文字セット」を参照してください。
文字リテラル
文字リテラル は、定数文字で構成されます。 これは、単一引用符で囲まれた文字で表されます。 文字リテラルには、次の5種類があります。
-
たとえば、型の通常の文字リテラル char‘a’
-
char(C++ 20 の) 型の utf-8 文字リテラル ( char8_t 例:)u8’a’
-
wchar_t型のワイド文字リテラル。たとえば L’a’
-
型の UTF-16 文字リテラル char16_t (例:) u’a’
-
型の UTF-32 文字リテラル char32_t (例:) U’a’
文字リテラルに使用される文字には、予約文字 ( )、単一引用符 ()、または改行を除く任意の文字を使用でき ‘ ます。 予約文字は、エスケープ シーケンスを使用して指定することができます。 型が文字を保持するのに十分な大きさであれば、文字はユニバーサル文字名を使用して指定することができます。
Encoding
文字リテラルは、プレフィックスに基づいて異なる方法でエンコードされます。
-
プレフィックスのない文字リテラルは、通常の文字リテラルです。 実行文字セットで表すことができる単一の文字、エスケープシーケンス、またはユニバーサル文字名を含む通常の文字リテラルの値には、実行文字セットにおけるそのエンコードの数値と同じ値が設定されています。 複数の文字、エスケープシーケンス、またはユニバーサル文字名を含む通常の文字リテラルは、 多文字リテラルです。 実行文字セットで表現できない多文字リテラルまたは通常の文字リテラルには型があり、 int その値は実装定義されています。 MSVC については、以下の「 Microsoft 固有のセクション」を参照してください。
-
プレフィックスで始まる文字リテラルは、 L ワイド文字リテラルです。 1つの文字、エスケープシーケンス、またはユニバーサル文字名を含むワイド文字リテラルの値には、実行ワイド文字セット内で文字リテラルが表現されていない場合、実行ワイド文字セットのエンコードの数値と同じ値が含まれます。この場合、値は実装定義になります。 複数の文字、エスケープシーケンス、またはユニバーサル文字名を含むワイド文字リテラルの値は、実装によって定義されます。 MSVC については、以下の「 Microsoft 固有のセクション」を参照してください。
-
プレフィックスで始まる文字リテラルは、 u8 utf-8 文字リテラルです。 1文字、エスケープシーケンス、またはユニバーサル文字名を含む UTF-8 文字リテラルの値は、1つの UTF-8 コード単位 (C0 コントロールと基本ラテン Unicode ブロックに対応する) で表すことができる場合は、ISO 10646 コードポイント値と同じ値になります。 値を1つの UTF-8 コード単位で表すことができない場合、プログラムの形式が正しくありません。 複数の文字、エスケープシーケンス、またはユニバーサル文字名を含む UTF-8 文字リテラルの形式が正しくありません。
-
プレフィックスで始まる文字リテラルは、 u utf-16 文字リテラルです。 1つの文字、エスケープシーケンス、またはユニバーサル文字名を含む UTF-16 文字リテラルの値は、1つの UTF-16 コード単位 (基本的な多言語面に対応) で表すことができる場合は、ISO 10646 のコードポイント値と同じ値になります。 値を1つの UTF-16 コード単位で表すことができない場合、プログラムの形式が正しくありません。 複数の文字、エスケープシーケンス、またはユニバーサル文字名を含む UTF-16 文字リテラルの形式が正しくありません。
-
プレフィックスで始まる文字リテラルは、 U 32 文字リテラルです。 1つの文字、エスケープシーケンス、またはユニバーサル文字名を含む 32 UTF-8 文字リテラルの値には、ISO 10646 のコードポイント値と同じ値が指定されています。 複数の文字、エスケープシーケンス、またはユニバーサル文字名を含む 32 UTF-8 文字リテラルの形式が正しくありません。
エスケープ シーケンス
エスケープ シーケンスには、単純、8 進数、16 進数という 3 つの種類があります。 エスケープシーケンスには、次のいずれかの値を指定できます。
値 エスケープ シーケンス 改行 n 円記号 \ 水平タブ t 疑問符 ? または ? 垂直タブ v 単一引用符 (‘) ‘ バックスペース b 二重引用符 (“) ” キャリッジ リターン r null 文字 フォーム フィード f 8 進数 ooo 警告 (ベル) a 16 進数 xhhh
8進数のエスケープシーケンスは、円記号とそれに続く 1 ~ 3 桁の8進数のシーケンスです。 8進数のエスケープシーケンスは、3番目の桁よりも早く検出された場合、8進数の数字ではない最初の文字で終了します。 有効な8進数の最大値は 377 です。
16進数のエスケープシーケンスは、円記号の後に文字が続き、その x 後に1つ以上の16進数字のシーケンスが続きます。 先行 0 は無視されます。 通常または u8 のプレフィックスが付いた文字リテラルでは、最大の16進値は0xFF です。 L プレフィックス付きまたは u プレフィックス付きワイド文字リテラルでは、最大の 16 進値は 0xFFFF です。 U プレフィックス付きワイド文字リテラルでは、最大の 16 進値は 0xFFFFFFFF です。
このサンプルコードでは、通常の文字リテラルを使用したエスケープ文字の例をいくつか示します。 同じエスケープシーケンス構文は、他の文字リテラル型に対して有効です。
#include <iostream> using namespace std; int main() { char newline = ‘n’; char tab = ‘t’; char backspace = ‘b’; char backslash = ‘\’; char nullChar = ”; cout << “Newline character: ” << newline << “ending” << endl; cout << “Tab character: ” << tab << “ending” << endl; cout << “Backspace character: ” << backspace << “ending” << endl; cout << “Backslash character: ” << backslash << “ending” << endl; cout << “Null character: ” << nullChar << “ending” << endl; } /* Output: Newline character: ending Tab character: ending Backspace character:ending Backslash character: ending Null character: ending */
円記号 ( ) は、行の末尾に配置されている場合は、行連結文字です。 円記号が文字リテラルとして表示されるようにするには、円記号を 2 つ並べて (\) 入力する必要があります。 行連結文字について詳しくは、「 Phases of Translation」をご覧ください。
Microsoft 固有の仕様
ナロー多文字リテラルから値を作成するために、コンパイラは、1つの引用符の間の文字または文字シーケンスを32ビット整数内の8ビット値に変換します。 リテラル内の複数の文字に対応するバイトが、必要に応じて、上位から下位に入力されます。 次に、通常の規則に従って、整数が変換先の型に変換されます。 たとえば、値を作成するために、 char コンパイラは下位バイトを取得します。 wchar_t または char16_t 値を作成する場合、コンパイラは下位ワードを取得します。 割り当てられたバイトまたはワードを上回るビットが設定された場合、コンパイラは結果が切り捨てられることを警告します。
char c0 = ‘abcd’; // C4305, C4309, truncates to ‘d’ wchar_t w0 = ‘abcd’; // C4305, C4309, truncates to ‘x6364’ int i0 = ‘abcd’; // 0x61626364
3桁を超える数値が含まれているように見える8進数のエスケープシーケンスは、3桁の8進数シーケンスとして扱われ、その後に多文字リテラルの文字として後続の数字が続きます。これにより、驚くほどの結果が得られます。 例:
char c1 = ‘100’; // ‘@’ char c2 = ‘1000’; // C4305, C4309, truncates to ‘0’
8進数以外の文字が含まれているように見えるエスケープシーケンスは、最後の8進数文字までの8進数シーケンスとして評価され、その後に多文字リテラルの後続の文字として残りの文字が続きます。 最初の 8 進数以外の文字が 10 進数の場合、警告 C4125 が生成されます。 例:
char c3 = ’09’; // ‘9’ char c4 = ’89’; // C4305, C4309, truncates to ‘9’ char c5 = ‘qrs’; // C4129, C4305, C4309, truncates to ‘s’
より大きな値を持つ 8 進数のエスケープ シーケンスでは、エラー 377 C2022: ‘377’: 文字が大きすぎます。
16 進文字と 16 進数以外の文字が含まれていると思えるエスケープ シーケンスは、最後の 16 進文字までの 16 進エスケープ シーケンスを含むマルチ文字リテラルとして評価され、その後に 16 進数以外の文字が続きます。 16 進数を含む 16 進数のエスケープ シーケンスでは、コンパイラ エラー C2153: “16 進リテラルには少なくとも 1 つの 16 進数字が必要です” が発生します。
char c6 = ‘x0050’; // ‘P’ char c7 = ‘x0pqr’; // C4305, C4309, truncates to ‘r’
プレフィックスが付くワイド文字リテラルにマルチ文字シーケンスが含まれている場合、値は最初の文字から取得され、コンパイラは警告 L C4066 を生成します。 同等の通常のマルチ文字リテラルの動作とは異なり、後続の文字は無視されます。
wchar_t w1 = L’100′; // L’@’ wchar_t w2 = L’1000′; // C4066 L’@’, 0 ignored wchar_t w3 = L’09’; // C4066 L”, 9 ignored wchar_t w4 = L’89’; // C4066 L”, 89 ignored wchar_t w5 = L’qrs’; // C4129, C4066 L’q’ escape, rs ignored wchar_t w6 = L’x0050′; // L’P’ wchar_t w7 = L’x0pqr’; // C4066 L”, pqr ignored
Microsoft 固有のセクションは 、ここで終了します。
ユニバーサル文字名
文字リテラルとネイティブ (未加工ではない) 文字列リテラルでは、ユニバーサル文字名であらゆる文字を表すことができます。 ユニバーサル文字名は、プレフィックスの後に 8 桁の Unicode コード ポイントが続く形式で、プレフィックスの後に 4 桁の Unicode コード ポイント Uu が続きます。 正しい形式のユニバーサル文字名を作成するには、それぞれ、8 桁または 4 桁のすべてが存在する必要があります。
char u1 = ‘A’; // ‘A’ char u2 = ‘101’; // octal, ‘A’ char u3 = ‘x41’; // hexadecimal, ‘A’ char u4 = ‘u0041’; // u UCN ‘A’ char u5 = ‘U00000041’; // U UCN ‘A’
サロゲート ペア
ユニバーサル文字名では、サロゲート コード ポイント範囲 D800-DFFF の値をエンコードできない。 Unicode サロゲート ペアの場合は、 UNNNNNNNNを使用してユニバーサル文字名を指定します。ここで、NNNNNNNN は文字用の 8 桁のコード ポイントです。 コンパイラは、必要に応じてサロゲート ペアを生成します。
C++03 では、言語では、文字のサブセットをユニバーサル文字名で表すだけで、有効な Unicode 文字を実際には表さなかった一部のユニバーサル文字名を許可しました ’ 。 この間違いは、C++11 標準で修正されました。 C++11 では、文字リテラルと文字列リテラルの両方と識別子でユニバーサル文字名を使用できます。 ユニバーサル文字名について詳しくは、「 Character Sets」をご覧ください。 Unicode について詳しくは、「 Unicode」をご覧ください。 サロゲート ペアについて詳しくは、「 サロゲート ペアと補助文字」をご覧ください。
文字列リテラル
文字列リテラルは文字のシーケンスを表し、その全体が、null で終わる文字列を形成します。 文字列は二重引用符で囲む必要があります。 文字列リテラルの種類は次のとおりです。
ナロー文字列リテラル
ナロー文字列リテラルは、プレフィックスが付いていない二重引用符で区切られた、null で終える型の配列です。ここで、n は配列の長さ (バイト単位) const char[n] です。 ナロー文字列リテラルには、二重引用符 (“)、円記号 ()、または改行文字を除く、任意のグラフィック文字を含めることができます。 ナロー文字列リテラルには、上記のエスケープ シーケンスと、1 バイトに収まるユニバーサル文字名を含めることもできます。
const char *narrow = “abcd”; // represents the string: yesno const char *escaped = “yes\no”;
UTF-8 でエンコードされた文字列
UTF-8 でエンコードされた文字列は、 型の u8 プレフィックス付き二重引用符で区切られた null 終端配列です。 const char[n]const char[n] はエンコードされた配列の長さ (バイト単位) です。 u8 プレフィックス付き文字列リテラルには、二重引用符 (“)、円記号 ()、または改行文字を除く、任意のグラフィック文字を含めることができます。 u8 プレフィックス付き文字列リテラルには、上記のエスケープ シーケンスと、任意のユニバーサル文字名を含めることもできます。
C++20 では、ポータブル char8_t (UTF-8 でエンコードされた 8 ビット Unicode) 文字型が導入されています。 C++20 では、 u8 リテラル プレフィックスは ではなく、 の文字または文字列 char8_t を指定します char 。
// Before C++20 const char* str1 = u8″Hello World”; const char* str2 = u8″U0001F607 is O:-)”; // C++20 and later const char8_t* u8str1 = u8″Hello World”; const char8_t* u8str2 = u8″U0001F607 is O:-)”;
ワイド文字列リテラル
ワイド文字列リテラルは、” でプレフィックスが付いた、null で終わる定数の配列であり、二重引用符 ( )、円記号 ( )、または改行文字を除く任意のグラフィック文字が含まれます。 wchar_tL“ ワイド文字列リテラルには、上記のエスケープ シーケンスと、任意のユニバーサル文字名を含めることができます。
const wchar_t* wide = L”zyxw”; const wchar_t* newline = L”hellongoodbye”;
char16_t および char32_t (C++11)
C++11 では、移植可能な char16_t (16 ビット Unicode) および char32_t (32 ビット Unicode) 文字型が導入されています。
auto s3 = u”hello”; // const char16_t* auto s4 = U”hello”; // const char32_t*
生の文字列リテラル (C++11)
生文字列リテラルは、二重引用符 ( )、円記号 ( )、改行文字など、任意のグラフィック文字を含む任意の文字型の null で終える配列 ——“ です。 未加工文字列リテラルは、文字クラスを使用する正規表現や、HTML 文字列、XML 文字列でよく使用されます。 例については、記事「 C++11 に関する Bjarne Stroustrup の FAQ」をご覧ください。
// represents the string: An unescaped character const char* raw_narrow = R”(An unescaped character)”; const wchar_t* raw_wide = LR”(An unescaped character)”; const char* raw_utf8a = u8R”(An unescaped character)”; // Before C++20 const char8_t* raw_utf8b = u8R”(An unescaped character)”; // C++20 const char16_t* raw_utf16 = uR”(An unescaped character)”; const char32_t* raw_utf32 = UR”(An unescaped character)”;
区切り記号は、生文字列リテラルの始めかっこの直前に、その終りのかっこの直後に続く、最大 16 文字のユーザー定義シーケンスです。 たとえば、 R”abc(Hello”()abc” では、区切り記号シーケンスが abc で、文字列コンテンツが Hello”(です。 区切り記号を使用することで、二重引用符とかっこの両方を含む未加工の文字列の曖昧さを解消できます。 この文字列リテラルにより、コンパイラ エラーが発生します。
// meant to represent the string: )” const char* bad_parens = R”()”)”; // error C2059
しかし、区切り文字を使用することで、エラーは解決します。
const char* good_parens = R”xyz()”)xyz”;
ソース内に改行 (エスケープ文字ではなく) を含む生の文字列リテラルを作成できます。
// represents the string: hello //goodbye const wchar_t* newline = LR”(hello goodbye)”;
std::string リテラル (C++14)
std::string リテラルは、(サフィックス付き) として表されるユーザー定義リテラル (下記参照) の標準ライブラリ “xyz”s 実装 s です。 この種の文字列リテラルは、指定されたプレフィックスに応じて、または 型の一時 std::stringstd::wstringstd::u32stringstd::u16string オブジェクトを生成します。 上記のようにプレフィックスを使用すると、 が std::string 生成されます。 L”xyz”s は を生成します std::wstring 。 u”xyz”s は u”xyz”sを生成し U”xyz”sU”xyz”s。
//#include <string> //using namespace std::string_literals; string str{ “hello”s }; string str2{ u8″Hello World” }; // Before C++20 u8string u8str2{ u8″Hello World” }; // C++20 wstring str3{ L”hello”s }; u16string str4{ u”hello”s }; u32string str5{ U”hello”s };
サフィックス s は、生の文字列リテラルでも使用できます。
u32string str6{ UR”(She said “hello.”)”s };
std::string リテラルは、文字列ヘッダー ファイルの std::literals::string_literals 名前空間 < で > 定義されます。 と はどちらもインライン名前空間として宣言されています。そのため、 は名前空間 に直接属している場合と同様 std::literals::string_literalsstd::literalsstd::literals::string_literalsstd::literals::string_literals に自動的に処理されます std 。
文字列リテラルのサイズ
ANSI 文字列および他の 1 バイト エンコーディング (UTF-8 ではない) の場合、文字列リテラルのサイズ (バイト単位) は、終端の null 文字の文字数に 1 を加えた文字数です。 char* 他のすべての文字列型の場合、サイズは文字数に厳密に関連付けることはできません。 UTF-8 では、最大 4 つの要素を使用して一部のコード単位 をエンコードします。 charcharchar16_twchar_t また、UTF-16char16_tとしてエンコードされた 場合、2 つの要素 (合計 4 バイト) を使用して 1 つのコード単位 をエンコードできます。 この例では、ワイド文字列リテラルのサイズがバイト単位で表示されます。
const wchar_t* str = L”Hello!”; const size_t byteSize = (wcslen(str) + 1) * sizeof(wchar_t);
と には、文字列型の要素サイズと等しい終端 strlen()wcslen() の null char*char8_t*wchar_t*char16_t* 文字のサイズ char32_t* (または文字列の場合は 1 バイト、文字列の場合は 2 バイト、文字列の場合は 4 バイト) は含めることはできません。
文字列リテラルの最大長は 65,535 バイトです。 この制限は、ナローとワイドの両方の文字列リテラルに適用されます。
文字列リテラルの変更
文字列リテラル (リテラルを含めない) は定数なので、変更を試みようとすると、コンパイラ std::string—str[2] = ‘A’— エラーが発生します。
Microsoft 固有の仕様
Microsoft C++ では、文字列リテラルを使用して、非 const または へのポインターを初期化 char できます wchar_t 。 この非 const 初期化は C99 コードでは許可されますが、C++98 では非推奨となり、C++11 では削除されます。 文字列を変更すると、この例のようにアクセス違反が発生します。
wchar_t* str = L”hello”; str[2] = L’a’; // run-time error: access violation
(文字列リテラル型変換を無効にする )コンパイラ オプションを設定すると、文字列リテラルが非定数文字ポインターに変換された場合に、コンパイラがエラーを生成する可能性があります。 標準に準拠した移植可能なコードには、この方法をお勧めします。 また、 キーワードを使用して、文字列リテラルで初期化されたポインターを宣言する方法も、正しい auto (const) 型に解決されます。 たとえば、このコード例ではコンパイル時に文字列リテラルへの書き込みの試みがキャッチされます。
auto str = L”hello”; str[2] = L’a’; // C3892: you cannot assign to a variable that is const.
場合によっては、実行可能ファイルの領域を節約するために、同じ文字列リテラルをプールできます。 文字列リテラルのプールでは、各参照が文字列リテラルの各インスタンスを指すのではなく、コンパイラにより、特定の文字列リテラルへのすべての参照がメモリ内の同じ場所を指します。 文字列プールを有効にするには、コンパイラ オプションを /GF 使用します。
Microsoft 固有のセクションは 、ここで終了します。
隣接する文字列リテラルの連結
隣接するワイド文字列リテラルまたはナロー文字列リテラルは連結されます。 次の宣言は、
char str[] = “12” “34”;
次の宣言と同じです。
char atr[] = “1234”;
次の宣言も同じです。
char atr[] = “12 34”;
埋め込みの 16 進数エスケープ コードを使用して文字列リテラルを指定すると、予期しない結果が生じることがあります。 次の例では、ASCII 文字 5 の後に文字列 f、i、v、および e を含む文字列リテラルを作成しようとしています。
“x05five”
実際の結果は、16 進数値 5F (アンダースコアの ASCII コード) に文字列 i、v、および e が続きます。 正しい結果を取得するには、次のいずれかのエスケープ シーケンスを使用できます。
“05five” // Use octal literal. “x05” “five” // Use string splicing.
std::string リテラル (および関連する 、、および ) は、型に対して定義されている演算子 std::u8stringstd::u16stringste::u32string+ と連結 basic_string できます。 隣接する文字列リテラルと同じ方法で連結することもできます。 いずれの場合も、次のように文字列のエンコードとサフィックスは一致していなければなりません。
auto x1 = “hello” ” ” ” world”; // OK auto x2 = U”hello” ” ” L”world”; // C2308: disagree on prefix auto x3 = u8″hello” ” “s u8″world”z; // C3688, disagree on suffixes
ユニバーサル文字名を持つ文字列リテラル
ネイティブ (未加工でない) 文字列リテラルは、ユニバーサル文字名が文字列型の 1 つ以上の文字としてエンコードできる限り、ユニバーサル文字名を使用して任意の文字を表すことができます。 たとえば、拡張文字を表すユニバーサル文字名は、ANSI コード ページを使用して狭い文字列でエンコードできますが、一部のマルチバイト コード ページや UTF-8 文字列、またはワイド文字列内のナロー文字列でエンコードできます。 C++11 では、Unicode のサポートは および 文字列型によって拡張され char16_t*char32_t* 、C++20 では型に拡張 char8_t されます。
// ASCII smiling face const char* s1 = “:-)”; // UTF-16 (on Windows) encoded WINKING FACE (U+1F609) const wchar_t* s2 = L”😉 = U0001F609 is ;-)”; // UTF-8 encoded SMILING FACE WITH HALO (U+1F607) const char* s3a = u8″😇 = U0001F607 is O:-)”; // Before C++20 const char8_t* s3b = u8″😇 = U0001F607 is O:-)”; // C++20 // UTF-16 encoded SMILING FACE WITH OPEN MOUTH (U+1F603) const char16_t* s4 = u”😃 = U0001F603 is :-D”; // UTF-32 encoded SMILING FACE WITH SUNGLASSES (U+1F60E) const char32_t* s5 = U”😎 = U0001F60E is B-)”;
こちらもご覧ください
文字セット 数値リテラル、ブール型リテラル、およびポインター リテラル ユーザー定義リテラル
Trả lời