使用';编写原始字符串的正确格式是什么$';在C++;? 我正在学习C++中的原始字符串。根据该站点上的定义,原始字符串应以R”序列(开头,以序列结尾,其中序列可以是任何字符序列

使用';编写原始字符串的正确格式是什么$';在C++;? 我正在学习C++中的原始字符串。根据该站点上的定义,原始字符串应以R”序列(开头,以序列结尾,其中序列可以是任何字符序列,c++,string,C++,String,该网站的一个示例如下: R“&%$(带\反斜杠的字符串)&%$” 然而,当我试图编译包含上述原始字符串的代码时,我得到了一个编译错误 test.cpp:5:28: error: invalid character '$' in raw string delimiter 5 | std::string str = R"&%$(string with \backslash)&%$"; | ^

该网站的一个示例如下:

R“&%$(带\反斜杠的字符串)&%$”

然而,当我试图编译包含上述原始字符串的代码时,我得到了一个编译错误

test.cpp:5:28: error: invalid character '$' in raw string delimiter
    5 |     std::string str = R"&%$(string with \backslash)&%$";
      |                       ^
test.cpp:5:23: error: stray 'R' in program


我在Windows和Linux上使用g++和clang++进行了尝试。它们都不起作用。

只需删除
$
,如下所示:

string string3 = R"&%(string with \backslash)&%";
$
给出错误,因为基本源字符集没有注释中所述的
$

  • 源代码文件的各个字节被映射(以实现定义的方式)到基本源字符集的字符。特别是,依赖操作系统的行尾指示符被换行符替换。基本源字符集由96个字符组成:
  • a) 5个空白字符(空格、水平制表符、垂直制表符、换行符、换行符)

    b) 从“0”到“9”的10位字符

    c) 从“a”到“z”以及从“a”到“z”的52个字母

    d) 29个标点符号:{}[]#(<>%:;.?*+-/^&&{124; ~!=,\“' 2) 任何无法映射到基本源字符集中的字符的源文件字符都将替换为其通用字符名(用\u或\u转义),或替换为某种等效处理的实现定义形式


    参考:

    有关基本源字符集,请参阅:该集不包含
    $
    字符。有关原始字符串文字中允许的前缀字符,请参见:“/…/基本源字符集的任何成员,但空格、左括号
    、右括号
    、反斜杠
    \
    ,以及表示水平制表符、垂直制表符、换行符和换行符的控制字符除外。”(强调矿山)。

    来自:

    分隔符:由除括号、反斜杠和空格以外的任何源字符组成的字符序列(可以为空,最多16个字符)

    注意这里的“任意源字符”部分

    让我们看看标准是怎么说的:

    来自[gram.lex]:

    原始字符串:
    “d-char-sequenceopt(r-char-sequenceopt)d-char-sequenceopt”

    d-字符序列:
    d-char
    d-char序列d-char

    d-char:
    基本源字符集的任何成员,空格、左括号
    、右括号
    、反斜杠
    \
    ,以及表示水平制表符、垂直制表符、换行符和换行符的控制字符除外

    那么,基本的源字符集是什么?来自[lex.charset]:

    基本源字符集由96个字符组成:空格字符、代表水平制表符、垂直制表符、换行符和新行的控制字符,以及以下91个图形字符:

    a b c d e f g i j k l m n o p q r s t v w x y z a b c d e g i j l m n o p q r s t v w x y z 0 1 2 3 4 5 6 7 8 9{}(<>%:;.?*+-/^&| ~!=,\“”


    …不包括
    $
    ;因此结论是美元符号
    $
    不能是分隔符序列的一部分。

    引用:“由任何源字符组成的字符序列,但不包括圆括号、反斜杠和空格”(强调部分)但是,它不包含<代码> $> /Cux>字符,这就是为什么.@ DeSrErjm可能是因为<代码> $/COD>不用于任何语言特征中。我认为,基本集需要能够表示关键字、数字、运算符和其他内置C++语言特征。我们只是“为了好玩”;)“这是网站的一个例子“cplusplus.com再次罢工。最好假装这个网站不存在。我误解了哪里不能使用
    $
    。我现在明白了,这是有道理的。@NicolBolas-如果谷歌在搜索结果中不总是把cplusplus.com放在cppreference.com之上就好了…@AntoninGAVREL也许回到了以前,键盘的布局/编码没有
    $
    符号?我不太确定。@AntoninGAVREL:有什么需要解决的?只是不要在这里使用它。没有特别的理由。@drescherjm它没有从文本体中排除
    $
    ,只排除分隔符。几乎总是可以从
    88^16
    组合中找到一个非常好的分隔符。我现在明白了,谢谢。简而言之:使用cppreference.com,而不是cplusplus.com。后者往往会有更多类似的不准确之处,浪费的时间会越来越多。