问题 为什么原始字符串文字的分隔符必须低于16个字符?


以下程序无法编译:

#include <iostream>

int main() {
    std::cout << R"RAW_STRING_LITERAL(
        hello
        world
        )RAW_STRING_LITERAL";
}

错误:  raw string delimiter longer than 16 characters

为什么对原始字符串分隔符施加限制长度?


11081
2017-08-04 20:04


起源

你认为不应该吗? - Lightness Races in Orbit
相关的提案文件中的选择似乎是任意的,但我会留下回答其他人。 - Lightness Races in Orbit
这可能是特定于实现的。你在用哪个编译器?什么OS? - ventsyv
如果原始字符串分隔符可以具有任意长度,则它们可能形成另一种图灵完整语言。 - Kerrek SB
@LightnessRacesinOrbit,我正在根据一些数据生成一些c ++代码,并且这些数据在生成期间被放入原始字符串文字中。部分数据有可能超过16个字符。它并没有真正影响我;我可以确保一个独特的分隔符,但这只是我没想到的。出于实际目的,我认为将16作为限制没有任何问题。我想我会问,看看它是否确实是任意的,与解析有关,或者是为了允许更快的编译而决定的。 - Trevor Hickey


答案:


我能找到的最初的原始字符串文字提案是 N2146 作者:Beman Dawes。它包含文字:

最大长度 d-炭序列 应为16个字符。

这似乎是作者施加的任意限制,他可能决定16个字符足以在所有情况下创建明确的分隔符序列。

该提案还指出

终止 d-炭序列 原始字符串文字的字符串应与初始字符串的字符序列相同 d-炭序列

因此,符合要求的实现必须缓冲和处理 d-炭序列 确保两个序列匹配。没有任何限制 d-炭序列 会不必要地增加实现功能的复杂性。


10
2017-08-04 20:35





该标准规定:

在前缀中具有R的字符串文字是原始字符串文字。   d-char序列用作分隔符。终止   原始字符串的d-char序列与字符序列相同   最初的d-charsequence。 d-char序列最多应包含一个   16个字符

http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf §2.13.5第28页

标准中没有给出任何理由,但对我来说,这似乎是完全随机的限制,因为它应该使分隔符完全没有区别。


1
2017-08-04 20:22



是给出的理由,还是我们可以假设长度是任意决定的? (我不是以负面的方式任意,而是字面意义。) - Mr. Llama
我也很想知道这一点。 - Lightness Races in Orbit
在其中一个附录中,它们指定了诸如模板参数的数量和类嵌套深度之类的下限。这个 上 一般标准文本中出现的界限非常不寻常。这似乎是16的最大char序列应该是最小值并且允许是ID。 - emsr
OTOH,也许他们担心便携性。 - emsr