为什么C++中+++x会被分成++(+x)而不是+(++x)?

Bel*_*ang 2 c++ operators

当我输入下面的代码时

int x = 1;
+++x;
Run Code Online (Sandbox Code Playgroud)

它会被分成++(+x),当然这个句子是错误的,因为 后面有一个右值++

我很好奇为什么不能+(++x),其中代码是正确的。

这取决于 IDE 还是编译器?

可以在 C++ 标准中找到吗?或者这只是一个未定义的行为?

非常感谢回答这个问题并原谅我糟糕的英语。

Chr*_*sMM 7

来自 C++20(草案 N4860)[lex.pptoken]/3.3

\n
\n

\xe2\x80\x94 否则,下一个预处理标记是可以构成预处理标记的最长字符序列,即使这会导致进一步的词法分析失败,...

\n
\n

[lex.pptoken]/6

\n
\n

[示例:程序片段 x+++++y 被解析为 x ++ ++ + y,如果 x 和 y 具有整型,则\n违反了对增量运算符的约束,即使解析 x ++ + ++ y 可能会产生正确的\n表达式。\xe2\x80\x94结束示例]

\n
\n

+因此,the与变量一起使用是语言的规则,因为++首先被分组在一起。

\n

有趣的是,这让我想起了一个老问题:std::vector<std::vector<int>> a用于引起问题,因为>>将是一个标记而不是两个(因为它应该是最长的字符序列)。这是通过解决[temp.names]/3

\n
\n

当名称被视为模板名称且其后跟有 < 时,< 始终被视为模板参数列表的分隔符,而绝不会被视为小于运算符。解析模板参数列表时,\n第一个非嵌套 > 被视为结束分隔符,而不是大于运算符。类似地,第一个非嵌套的 >> 被视为两个连续但不同的 > 标记,其中第一个标记被视为模板参数列表的末尾并完成模板 ID。[注意:此替换规则生成的第二个 > 标记可能会终止封闭的 template-id 构造,或者它可能是不同构造的一部分(例如强制转换)。\xe2\x80\x94结束注]

\n
\n