《C++11标准库》3.1.6新式的字符串字面常量 Raw string(String Literal)

自C++11始,你可以定义 raw string(原始/未加工字符串) 和 multibyte /wide-character(多字节/宽字符)等字符串字面常量。

Raw String Literal

Raw string 允许我们定义字符序列,做法是:确切的写下其内容使其成为一个raw character sequence(原始字符序列)。于是你可以省下很多用来装饰特殊字符的escape符号。

Raw string 以 "R(开头以 )"结尾,可以内 line break(换行符)。例如一个用来表示”两个反斜线和一个n“的寻常字符常量可以定义如下:

"\\\\n"

也可定义为如下 raw string literal:

R"(\\n)"

如果要在 raw string内写出 )",可以使用 delimiter (定义符)。因此,一个 raw string 的完整语法是

Raw "delim(...)delim",其中 delim 是个字符序列,最多16个基本字符,不可含反斜线,空格,和小括号。

例如 如下raw string literal:

R"nc(a\
     b\nc()"
     )nc";

等同于寻常 string literal:

"a\\\n    b\\nc()\"\n   "

这样的 string 内含一个a,一个反斜线,一个新行字符,若干空格,一个b,一个反斜线,一个n,一个c,一对小括号,一个双引号,一个新行号,以及若干空格。

在定义正则表达式时,raw string literal 特别有用。

编码的(Encoded )String Literal

只要使用编码前缀,你就可以为string literal 定义一个特殊的字符编码。下面这些编码前缀都预先定义好了:

u8 定义一个UTF-8编码。UTF-8 string literal 以UTF-8编订的某个给定字符起头,字符类型为 const char。

u定义一个 string literal,带着类型为 char16_t 的字符。

U定义一个 string literal,带着类型为char32_t 的字符。

L 定义一个 wide string literal ,带着类型为 wchar_t 的字符。

例如:

L"HELLO"; //定义一个类型为 wchar_t 的string literal字符“HELLO”

Raw string 开头那个R前面还可以放置一个编码前缀。


版权声明:本文为weixin_60351940原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。