对于嵌套模板,">>"何时成为标准C++(而不是"> >")?
For nested templates, when did `>>` become standard C++ (instead of `> >`)?
我似乎记得,在过去的时间里,被警告不要把两个>
字符放在彼此旁边(没有空格),当处理嵌套模板参数。我甚至模模糊糊地记得声明了向量的向量,然后遇到了这个编译错误。
但是现在我发现编译可怕的>>
绝对没有错…
我的问题是:
这个惯例在什么时候成为一种可接受的做法?
是标准c++的一部分吗?
是否一直是标准的一部分,而我在大学里使用的编译器(和我的教授)只是还不支持它?
也许这些问题有点历史,但对我来说,适当的历史背景似乎使实际的记忆变得微不足道。
用嵌套>>
封闭的模板在即将发布的标准c++ 0x(现在是c++ 11)中得到正式支持。以前,您需要空间,或者需要一个编译器为您做额外的工作(并且做标准中没有指示的事情)。
问题源于C中的>>
是右移操作符,这是一个单一的词法标记,它与经典构造的c++编译器解析阶段所需的两个单独的>
标记相冲突(仅在模板的情况下,而不是当它实际上是右移时)。换句话说,如果允许关闭嵌套模板,>>
在词法上是不明确的,但这可以(并且正在)通过解析过程中的额外复杂性来解决(这在现代c++中实际上并不是什么新鲜事)。
模板中的双尖括号语法在c++中仍然是非法的,但是一些编译器(特别是Visual Studio)允许它。在刚刚批准并等待发布的c++ 0x中,这个问题已经得到了纠正。
简而言之,它仍然不是合法的c++,但很快就会合法化。有些编译器允许这样做,但由于不是所有编译器都允许,因此您仍然应该将空格放在尖括号中。在两到三年内,你将不再需要这样做了。
希望这对你有帮助!
c++ 0x。你可以看看我的这个问题,了解更多信息。
它并不在标准中(直到最近——几天前)。
为什么?
一个字:效率。
不允许使语法上下文无关。这使得编译器更快一些。在过去美好的日子里,每一点都很重要。现在,随着算法和硬件的进步,没有人想要这个麻烦。
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- ``这个''不能用this-&gt;指针变量
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 使用shared_ptr<字符串>转换为一个无序集合<字符串>
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到