为什么C ++模板使用尖括号语法?

标题问题是指在1990年左右引入模板的C ++标准中的devise决策。

为什么devise师使用<> (尖括号)而不是()() (圆括号)? 这样做会节省大量程序员的位移有关的错误

 std::vector<std::vector<int>> // does not work until C++11 

这只在C ++ 11中得到了修复。 我没有看到引入额外语法的理由,可以说,圆括号可以达到同样的目的,同时保持更改极简。 绝对可以使用

 template(typename T) // Define template if round brackets could be used mytemplate { ... } ... ... mytemplate(mytemplate(int)) obj; //Instantiate template when round brackets could be used 

熟悉C ++历史的人能否挖掘使用尖括号的原始devise原理? 或者,你可以说明为什么其他解决scheme不会有效?

Bjarne Stroustrup在1988年的USENIX论文“ 参数化types”中介绍了模板,后来被纳入1990年出版的“注释的C ++参考手册 ”(标准化C ++之前的版本)。 根据这份文件,

括号(…)优先于括号(…)部分是为了强调模板参数的不同性质 (它们将在编译时进行评估),部分原因是括号已经在C ++中过度使用了

9.2。 <…> vs (…)

但为什么使用括号而不是括号? 如前所述,括号在C ++中已经有很多用途。 句法线索( <…>括号)可用于提醒用户关于types参数的不同性质(它们在编译时被评估) 。 而且,使用括号可能会导致相当模糊的代码:

 template(int sz = 20) class buffer { buffer(int i = 10); // ... }; buffer b1(100)(200); buffer b2(100); // b2(100)(10) or b2(20)(100)? buffer b3; // legal? 

如果采用明显的消除重载函数调用的符号,这些问题将成为严重的实际问题。 select的select似乎更清洁:

 template<int sz = 20> class buffer { buffer(sz)(int i = 10); // ... }; buffer b1<100>(200); buffer b2<100>; // b2<100>(10) buffer b3; // b3<20>(10) buffer b4(100); // b4<20>(100) 

该文件还解释了为什么使用templateclass关键字。

请注意,Stroustrup将variables名后面<…>放置为与int x[10]相同的方式来反驳(…) ,尽pipe这个放置在本文的其他地方从未使用过。

他的论点“使用(…)可能导致模糊/不明确的代码”仍然有效。 正如在这个问题的评论中提到的那样,使用括号T(x)会导致函数types或函数调用的不明确性(请注意, T可以是函数模板,C ++允许的值是模板参数)。

类似地,使用方括号T[x]导致数组types或索引模糊。

我不明白为什么T{x}还不能使用,也许根本没有考虑,或者在任何地方都使用{…}也许太丑了。