为什么原始字符串字面值的分隔符必须小于16个字符?

14

以下程序无法编译:

#include <iostream>

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

错误:原始字符串定界符超过16个字符的限制。

为什么原始字符串定界符有长度限制?


1
你认为不应该有吗? - Lightness Races in Orbit
选择似乎是从相关的提案文件中随意决定的,但我会把回答留给其他人。 - Lightness Races in Orbit
这可能是实现特定的。你使用哪个编译器?什么操作系统? - ventsyv
9
如果原始字符串定界符可以任意长度,它们可能会形成另一种图灵完备语言。 - Kerrek SB
1
@LightnessRacesinOrbit,我正在根据一些数据生成一些C++代码,并且在生成过程中将这些数据放入原始字符串字面量中。其中一些数据的部分可能超过16个字符。这对我来说并没有什么影响;我可以确保一个唯一的分隔符,但这是我没有预料到的事情。实际上,我认为将16作为限制没有任何问题。不过,我想问一下,这是否是任意的,是否与解析有关,或者是为了允许更快的编译而决定的。 - Trevor Hickey
2个回答

12
我找到的最早关于原始字符串字面量的提案是Beman Dawes的N2146。它包含以下文本:
d-char-sequence的最大长度应为16个字符。”
这似乎是作者强加的任意限制,他可能认为16个字符足以在所有情况下创建一个明确的分隔符序列。
该提案还声明:
“原始字符串文字的终止d-char-sequence必须与初始d-char-sequence相同。”
因此,符合规范的实现必须缓冲和处理d-char-sequence,以确保这两个序列匹配。如果没有任何对d-char-sequence的限制,将不必要地增加实现该功能的复杂性。

1
标准规定:
具有前缀R的字符串文字是原始字符串文字。d-char-sequence用作分隔符。原始字符串的终止d-char-sequence与初始d-char-sequence相同。一个d-char-sequence最多应该包含16个字符。 http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf § 2.13.5 第28页
标准未给出理由,但对我来说,这似乎是完全随机的限制,因为分隔符是什么应该没有任何区别。

有没有给出理由,或者我们可以假设长度是随意决定的?(我不是指贬义的随意,而是字面上的。) - Mr. Llama
我也很想知道这个。 - Lightness Races in Orbit
在附录中,他们指定了诸如模板参数数量和类嵌套深度之类的下限。在一般标准文本中出现的这个上限是非常不寻常的。似乎最大字符序列为16应该是一个最小值,并允许成为ID。 - emsr
另一方面,也许他们担心可移植性。 - emsr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接