对于嵌套模板,何时`>>`成为标准C ++(而不是`>>`)?

时间:2011-08-17 01:28:29

标签: c++ templates

我似乎记得,在以前的时候,在处理嵌套模板参数时,要警告不要将两个>字符放在彼此旁边(没有空格)。我甚至模糊地记得声明向量的向量并遇到这个编译错误。

但现在我发现编译可怕的>> ......绝对没有错。

我的问题是:

这个惯例在什么时候成为可接受的做法?

它是标准C ++的一部分吗?

它是否始终是标准的一部分,我在大学里使用的编译器(以及我所拥有的教授)只是不支持它?

也许这些问题有点历史,但对我而言,正确的历史背景似乎使得实际的记忆变得微不足道。

4 个答案:

答案 0 :(得分:24)

即将推出的标准C ++ 0x(现在是C ++ 11),使用嵌套>>关闭的模板为officially supported。以前你需要这个空间,或者需要为你付出额外努力的编译器(并做了标准所没有的事情)。

问题源于这样一个事实:C中的>>是右移运算符,它是一个单个词法标记,与解析过程中需要的两个单独的>标记冲突在经典构造的C ++编译器中的阶段(仅在模板的情况下,而不是在它实际上是右移)。换句话说,>>,如果允许关闭嵌套模板,则在词法上是模糊的,但在解析过程中可以(并且正在)通过额外的复杂性来解决(在现代C ++中实际上并不是什么新鲜事)。

答案 1 :(得分:3)

模板中的双尖括号语法在C ++中仍然是非法的,但是一些编译器(特别是Visual Studio)仍然允许它。在刚刚批准并正在等待发布的C ++ 0x中,这已得到纠正。

简而言之,它仍然不是合法的C ++,但很快就会出现。 Sme编译器允许它,但由于不是全部,你仍然应该将空格放在尖括号中。在两三年内,你不再需要这样了。

希望这有帮助!

答案 2 :(得分:1)

的C ++ 0x。您可以查看this question of mine以获取更多信息。

答案 3 :(得分:1)

这不符合标准(直到最近 - 几天前)。

为什么呢?

一句话:效率。

禁止使语法上下文自由。这使编译器更快一点。在过去的美好时光中,每一点都很重要。现在,随着算法和硬件的进步,没有人想要这个麻烦。