为什么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)
该文件还解释了为什么使用template
和class
关键字。
请注意,Stroustrup将variables名后面的<…>
放置为与int x[10]
相同的方式来反驳(…)
,尽pipe这个放置在本文的其他地方从未使用过。
他的论点“使用(…)
可能导致模糊/不明确的代码”仍然有效。 正如在这个问题的评论中提到的那样,使用括号T(x)
会导致函数types或函数调用的不明确性(请注意, T
可以是函数模板,C ++允许的值是模板参数)。
类似地,使用方括号T[x]
导致数组types或索引模糊。
我不明白为什么T{x}
还不能使用,也许根本没有考虑,或者在任何地方都使用{…}
也许太丑了。