字符串可以包含特殊字符,例如不可打印字符(换行符、水平制表符和垂直制表符等)、字符串和字符分隔符(双引号和单引号),或任意八进制、十六进制或Unicode值。这些特殊字符通过转义序列引入,该转义序列以反斜杠开头,后跟字符(例如'和")、其指定的字母(例如表示换行符的n和表示水平制表符的t)或值(例如八进制050、十六进制XF7或Unicode U16F0)。因此,反斜杠字符本身必须用另一个反斜杠字符进行转义,这会导致复杂的字面量字符串更难以理解。
为了避免转义字符,C++11引入了不处理转义序列的原始字符串字面量。在本节中,我们将介绍如何使用各种形式的原始字符串字面量。
在本节以及本书的其余章节中,我们将使用后缀s来定义basic_string字面量,这在2.5节中已经介绍过。
为了避免转义字符,定义字符串字面量需要使用以下任一形式:
❍ R"(literal)"作为默认形式:
❍ R"delimiter(literal)delimiter",其中delimiter是除括号、反斜杠和空格之外的任意字符的序列,而literal是任意字符序列,但不能包含结束序列的)delimiter"。以下是一个将!!作为分隔符的例子:
当使用字符串字面量时,不需要处理转义字符,字符串的实际内容是用分隔符隔开的(换句话说,所看到的就是实际的内容)。下面的示例展示了相同的原始字面量字符串,但第二个仍然包含转义字符。因为字符串字面量不需转义处理,它们将按原样输出:
如果文本必须包含)"序列,那么对于R"delimiter(literal)delimiter"形式必须使用不同的分隔符。根据标准,可能作为分隔符的字符如下:
基本源字符集的任何字符,除了空格、左括号(右括号)、反斜杠,以及表示水平制表符、垂直制表符、表单换行符和换行符的控制字符。
原始字符串字面量可以由L、u8、u和U前缀来分别表示宽字符串字面量,以及UTF8、UTF-16和UTF-32字符串字面量,以下是此类字符串字面量的示例:
值得注意的是,字符串结尾后缀""s的存在使编译器将类型推导为各种字符串类,而不是字符数组。
❍ 阅读2.5节,以了解如何创建用户自定义类型的字面量。