C++模板角度支架陷阱 - 什么是C++ 11修复?

Nor*_*wap 12 c++ parsing templates tokenize

在C++ 11中,这是现在有效的语法:

vector<vector<float>> MyMatrix;
Run Code Online (Sandbox Code Playgroud)

而以前,它必须这样写(注意空格):

vector<vector<float> > MyMatrix;
Run Code Online (Sandbox Code Playgroud)

我的问题是标准用于允许第一个版本的修复是什么?

它可以像制作>令牌一样简单而不是>>吗?如果不是这样,那么这种方法有什么用呢?

我认为这些表格myTemplate< x>>3 >不是问题,因为你可以通过这样做来消除它们的歧义myTemplate<(x>>3)>.

Mik*_*our 18

通过在解析模板参数时向解析规则添加特殊情况来解决此问题.

C++ 11 14.2/3:解析模板参数列表时,第一个非嵌套>被视为结束分隔符而不是大于运算符.类似地,第一个非嵌套>>被视为两个连续但不同的>标记,第一个被视为template-argument-list的结尾并完成template-id.

  • @Norswap 我错过了那部分。在上下文中,我希望“嵌套”仅指的是 `&lt;...&gt;` 类型的括号,但这并没有真正意义,所以它必须是。 (3认同)
  • 这看起来像一个缺陷。IIRC,意图是类似`template &lt;int i&gt; class X{}; X&lt;(10 &gt;&gt; 2)&gt;`(带有额外的括号)是合法的。 (2认同)
  • @JamesKanze Isn'被"非嵌套"部分所覆盖? (2认同)