shu*_*alo 41 c++ language-design template-meta-programming c++11
标题问题是指在1990年左右引入模板的C++标准中的设计决策.
为什么设计师使用<>(尖括号)而不是()(圆括号)?这样做可以节省大量程序员与位移相关的错误
std::vector<std::vector<int>> // does not work until C++11
Run Code Online (Sandbox Code Playgroud)
只在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
Run Code Online (Sandbox Code Playgroud)
精通C++历史的人能否挖掘出使用尖括号的原始设计理念?或者,你能说明为什么其他解决方案也不会有效吗?
ken*_*ytm 96
模板在Bjarne Stroustrup 的1988年USENIX论文参数化类型C++中引入,后来并入1990年出版的The Anlatedated C++ Reference Manual(标准化C++之前的版本).根据论文,
在
<…>括号中优先使用括号(…)部分来强调的模板参数的不同性质(他们会在编译时进行评估),部分是因为括号是已经用C绝望滥用++....
9.2.
<…>VS(…)但为什么要使用括号而不是括号?如前所述,括号在C++中已经有很多用途.句法线索(
<…>括号)可用于提醒用户类型参数的不同性质(它们在编译时进行评估).此外,使用括号可能导致相当模糊的代码:Run Code Online (Sandbox Code Playgroud)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?如果采用明确消除过载函数调用消歧的符号,这些问题将成为一个严重的实际问题.选择的替代方案似乎更清洁:
Run Code Online (Sandbox Code Playgroud)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 以与反对相同的方式放置变量名称<…> 之后,尽管此位置从未在本文的其他地方使用过.int x[10](…)
他的论点"使用(…)可能导致模糊/模糊的代码"仍然有效.正如本问题的评论中所提到的,使用括号T(x)会导致函数类型或函数调用的模糊性(请注意,T可以是函数模板,C++允许值为模板参数).
类似地,使用方括号T[x]会导致数组类型或索引的模糊性.
我不明白为什么T{x}不能使用它,也许它根本就没有考虑过,或者可能{…}在任何地方使用它都太难看了.