C++ “>&燃气轮机>;`用C++;0x?
C++ “>&燃气轮机>;`用C++;0x?,c++,c++11,C++,C++11,>>的词法为>>。但是,如果第一个关闭了模板参数列表,那么结果应该与>或>等效吗 这在以下代码中很重要: template<class T> struct X { }; void operator >>(const X<int>&, int) { } int main() { *new X<int>>> 1; } 模板结构X{}; void运算符>>(常量X&,int){} int main(){ *新X>>1;
>>
的词法为>>
。但是,如果第一个
关闭了模板参数列表,那么结果应该与>
或>
等效吗
这在以下代码中很重要:
template<class T> struct X { };
void operator >>(const X<int>&, int) { }
int main() {
*new X<int>>> 1;
}
模板结构X{};
void运算符>>(常量X&,int){}
int main(){
*新X>>1;
}
在这段特定的代码中,我的理解是它将是>
。解析器是贪婪的,会尝试将尽可能多的内容捆绑到每个标记中,当遇到第一个
时,上下文规则会规定它是完整的标记,不应尝试解析更多内容,但一旦超出模板参数的上下文,它将按照一般规则解析其余内容,好像它是X>
,或者
typedef X<int> X_int;
X_int >> 1;
typedef X_int;
X_int>>1;
FDIS的文本显示
类似地,第一个非嵌套>>被视为两个连续但不同的>标记
它不能取消释放代币和释放。所以这将是一个>
。注意,C++实现的输入首先被转换成预处理令牌,然后这些令牌被转换成C++令牌。所以首先输入的是C++令牌<代码> > >代码>,然后C++分析器将这些更改为<代码> > > /COD>
每个预处理令牌都转换为一个令牌。(2.7). 生成的标记在语法和语义上进行分析,并作为翻译单元进行翻译。[注:分析和翻译令牌的过程有时可能导致一个令牌被一系列其他令牌替换(14.2)。-结束注]
您不可能合并这两个尾随的
>
令牌 你在这里混合了解析器和词法分析器。解析器没有将任何东西绑定到令牌。@ybungalobill:您在上下文中不需要它,这太学究了。但是在这里,lexer(如果lr1)无法在没有帮助的情况下确定第一个'>'是模板的一部分。因此,术语解析器是有效的。我认为这取决于语言的版本,我认为C++0x词法>>>与旧版本不同。
对于模板参数是语言定义中的许多错误之一。@6502:您有更好的建议吗?所有的建议,使C++语法“更漂亮”的Pascalifying和Lal戒指它看起来丑陋的我。