当我输入下面的代码时
int x = 1;
+++x;
Run Code Online (Sandbox Code Playgroud)
它会被分成++(+x),当然这个句子是错误的,因为 后面有一个右值++。
我很好奇为什么不能+(++x),其中代码是正确的。
这取决于 IDE 还是编译器?
可以在 C++ 标准中找到吗?或者这只是一个未定义的行为?
非常感谢回答这个问题并原谅我糟糕的英语。
来自 C++20(草案 N4860)[lex.pptoken]/3.3
\n\n\xe2\x80\x94 否则,下一个预处理标记是可以构成预处理标记的最长字符序列,即使这会导致进一步的词法分析失败,...
\n
和[lex.pptoken]/6
\n\n[示例:程序片段 x+++++y 被解析为 x ++ ++ + y,如果 x 和 y 具有整型,则\n违反了对增量运算符的约束,即使解析 x ++ + ++ y 可能会产生正确的\n表达式。\xe2\x80\x94结束示例]
\n
+因此,the与变量一起使用是语言的规则,因为++首先被分组在一起。
有趣的是,这让我想起了一个老问题:std::vector<std::vector<int>> a用于引起问题,因为>>将是一个标记而不是两个(因为它应该是最长的字符序列)。这是通过解决[temp.names]/3
\n\n当名称被视为模板名称且其后跟有 < 时,< 始终被视为模板参数列表的分隔符,而绝不会被视为小于运算符。解析模板参数列表时,\n第一个非嵌套 > 被视为结束分隔符,而不是大于运算符。类似地,第一个非嵌套的 >> 被视为两个连续但不同的 > 标记,其中第一个标记被视为模板参数列表的末尾并完成模板 ID。[注意:此替换规则生成的第二个 > 标记可能会终止封闭的 template-id 构造,或者它可能是不同构造的一部分(例如强制转换)。\xe2\x80\x94结束注]
\n