C++11 では、引用符で囲まれた文字列、Windows ファイル パス、正規表現などの多くの特殊記号を含むリテラルを表すのに非常に便利な生の文字列リテラルが導入されました。
std::string path = R"(C:\teamwork\new_project\project1)"; // no tab nor newline!
std::string quoted = R"("quoted string")";
std::string expression = R"([\w]+[ ]+)";
u8
この生の文字列リテラルは、エンコーディング プレフィックス ( 、u
、U
、または)と組み合わせることもできますL
が、エンコーディング プレフィックスが指定されていない場合、ファイルのエンコーディングは問題になりますか? では、次のコードがあるとします。
auto message = R"(Pick up a card)"; // raw string 1
auto cards = R"()"; // raw string 2
上記のコードを記述して保存できれば、ソース コードが Unicode としてエンコードされていることは明らかです。
- ユニコード
raw string 1
リテラルですか?(ASCII文字のみを使用しますが)つまり、生の文字列はファイルのコード化を継承しますか、ファイルのエンコーディングに関係なく、Unicodeが不要であることをコンパイラが自動検出しますか? U
それをユニコードリテラルとして扱うためには、エンコーディングプレフィックスが必要raw string 2
ですか、それとも、その内容やソースファイルのエンコーディングのために自動的にユニコードになりますか?
ご清聴ありがとうございました。
編集:
上記のコードを ideone.com でテストし、デマングリングされたmessage
およびcards
変数の型を出力すると、次のように出力されますchar const*
。
template<typename T> std::string demangle(T t)
{
int status;
char *const name = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
std::string result(name);
free(name);
return result;
}
int main()
{
auto message = R"(Pick up a card)";
auto cards = R"()";
std::cout
<< "message type: " << demangle(message) << '\n'
<< "cards type: " << demangle(cards) << '\n';
return 0;
}
出力:
message type: char const*
cards type: char const*
これは私が思っていたよりもさらに奇妙で、型は(接頭辞wchar_t
がなくても) になると確信していました。L