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

For nested templates, when did `>>` become standard C++ (instead of `> >`)?

本文关键字:gt C++ 标准 于嵌套 嵌套 何时成      更新时间:2023-10-16

我似乎记得,在过去的时间里,被警告不要把两个>字符放在彼此旁边(没有空格),当处理嵌套模板参数。我甚至模模糊糊地记得声明了向量的向量,然后遇到了这个编译错误。

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

我的问题是:

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

是标准c++的一部分吗?

是否一直是标准的一部分,而我在大学里使用的编译器(和我的教授)只是还不支持它?

也许这些问题有点历史,但对我来说,适当的历史背景似乎使实际的记忆变得微不足道。

用嵌套>>封闭的模板在即将发布的标准c++ 0x(现在是c++ 11)中得到正式支持。以前,您需要空间,或者需要一个编译器为您做额外的工作(并且做标准中没有指示的事情)。

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

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

简而言之,它仍然不是合法的c++,但很快就会合法化。有些编译器允许这样做,但由于不是所有编译器都允许,因此您仍然应该将空格放在尖括号中。在两到三年内,你将不再需要这样做了。

希望这对你有帮助!

c++ 0x。你可以看看我的这个问题,了解更多信息。

它并不在标准中(直到最近——几天前)。

为什么?

一个字:效率。

不允许使语法上下文无关。这使得编译器更快一些。在过去美好的日子里,每一点都很重要。现在,随着算法和硬件的进步,没有人想要这个麻烦。