为什么没有正确解析 bitand 以形成右值引用?
Why isn't bitand properly parsed to form an rvalue reference?
可以使用替代标记形成右值引用:
int and i = 0;
也可以将物理源线拼接成逻辑源线后形成:
int &\
& i = 0;
那么为什么下面的程序编译不通过呢?
int main() {
int &\
bitand i = 5;
}
根据标准,我不明白为什么不应该这样做。
[lex.digraph] In all respects of the language, each alternative token
behaves the same, respectively, as its primary token, except for its
spelling.
[lex.phases] Each instance of a backslash character (\) immediately
followed by a new-line character is deleted, splicing physical source
lines to form logical source lines. Only the last backslash on any
physical source line shall be eligible for being part of such a
splice.
我是否遗漏了其他信息,或者这是一个编译器错误?
反斜杠+换行序列是一个转移注意力的问题。这些东西在标记化阶段(分别是翻译的第二阶段和第三阶段)之前被删除。因此,我们可以专注于这些片段:
&&
&bitand
第一行有一个标记,&&
。第二行有两个标记,&
和 bitand
。最后一个标记等同于 &
因此第二行的行为就好像它包含两个 &
标记一样。这与一个 &&
令牌不同。后者由两个 &
个字符组成,而不是两个 &
个标记。
可以使用替代标记形成右值引用:
int and i = 0;
也可以将物理源线拼接成逻辑源线后形成:
int &\
& i = 0;
那么为什么下面的程序编译不通过呢?
int main() {
int &\
bitand i = 5;
}
根据标准,我不明白为什么不应该这样做。
[lex.digraph] In all respects of the language, each alternative token behaves the same, respectively, as its primary token, except for its spelling.
[lex.phases] Each instance of a backslash character (\) immediately followed by a new-line character is deleted, splicing physical source lines to form logical source lines. Only the last backslash on any physical source line shall be eligible for being part of such a splice.
我是否遗漏了其他信息,或者这是一个编译器错误?
反斜杠+换行序列是一个转移注意力的问题。这些东西在标记化阶段(分别是翻译的第二阶段和第三阶段)之前被删除。因此,我们可以专注于这些片段:
&&
&bitand
第一行有一个标记,&&
。第二行有两个标记,&
和 bitand
。最后一个标记等同于 &
因此第二行的行为就好像它包含两个 &
标记一样。这与一个 &&
令牌不同。后者由两个 &
个字符组成,而不是两个 &
个标记。