如何在C ++ 0x中使用`>>>`lexed?

时间:2011-06-04 09:28:49

标签: c++ c++11

>>>被列为>> >。但是,如果第一个>关闭模板参数列表会发生什么,结果应该等同于> > >还是> >>

它在以下代码中很重要:

template<class T> struct X { };

void operator >>(const X<int>&, int) { }

int main() {
    *new X<int>>> 1;
}

2 个答案:

答案 0 :(得分:11)

FDIS的文字说

  

同样,第一个非嵌套&gt;&gt;被视为两个连续但不同的&gt;令牌

它不能解除令牌和反射。所以这将是> > >。请注意,C ++实现的输入首先被放入预处理标记中,然后这些标记将转换为C ++标记。首先,您的输入是C ++令牌>> >,然后C ++解析器将这些更改为> > >

  

每个预处理令牌都转换为令牌。 (2.7)。由此产生的标记在语法和语义上进行分析并翻译为翻译单元。 [注意:分析和翻译令牌的过程有时可能导致一个令牌被一系列其他令牌替换(14.2)。 - 结束说明]

您无法合并这两个尾随> >令牌。

答案 1 :(得分:1)

在那段特殊的代码中,我的理解是> >>。解析器是贪婪的,并且会尝试尽可能多地捆绑到每个令牌中,当遇到第一个>时,上下文规则将指示它是一个完整的令牌并且它不应该尝试解析更多,但是一旦它在模板参数的上下文之外,它将按照一般规则解析其余部分,就像它是X<int> >>

一样
typedef X<int> X_int;
X_int >> 1;