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

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++中已经有很多用途.句法线索(<…>括号)可用于提醒用户类型参数的不同性质(它们在编译时进行评估).此外,使用括号可能导致相当模糊的代码:

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)
Run Code Online (Sandbox Code Playgroud)

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

请注意,Stroustrup 以与反对相同的方式放置变量名称<…> 之后,尽管此位置从未在本文的其他地方使用过.int x[10](…)

他的论点"使用(…)可能导致模糊/模糊的代码"仍然有效.正如本问题的评论中所提到的,使用括号T(x)会导致函数类型或函数调用的模糊性(请注意,T可以是函数模板,C++允许值为模板参数).

类似地,使用方括号T[x]会导致数组类型或索引的模糊性.

我不明白为什么T{x}不能使用它,也许它根本就没有考虑过,或者可能{…}在任何地方使用它都太难看了.

  • @JAB是的它在2011年肯定是模棱两可的,但我没有看到在1988年拒绝它的理由.除非30年前实际计划的新式构造语法^ _ ^. (13认同)
  • 好吧,`{}`已经有两个用途了(对于块和旧式初始化器),所以虽然可能没有任何语法歧义,但对于程序员来说会更加困惑. (5认同)