【发布时间】:2017-09-01 09:59:06
【问题描述】:
名义上的问题是指在 1990 年左右引入模板的 C++ 标准中的设计决策。
为什么设计师使用<>(尖括号)而不是()(圆括号)?这样做可以让很多程序员免于与位移相关的错误
std::vector<std::vector<int>> // does not work until C++11
仅在 C++11 中得到修复。我看不出引入类似这样的附加语法的理由,可以说,圆括号可以达到相同的目的,同时保持更改的最小化。 Insted 你可以使用
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++ 历史的人能否找出使用尖括号的原始设计原理?或者,您能否说明为什么其他解决方案效果不佳?
【问题讨论】:
-
因为函数指针。
int(int(int)) obj;将使obj成为一个指向函数的指针,该函数返回int并获取指向返回int并获取int的函数的指针。或类似的东西。 -
圆括号对函数模板的影响更大:在
template_function(int())()中,int()是模板参数还是函数参数? -
@ysc 假设 unicode,有数十亿个替代字符。我们应该一个一个地覆盖它们吗?在每种情况下都必须证明它比
<>更糟吗?几乎可以肯定,这不是用于决定<>的过程:描述整个过程对于 SO 来说太宽泛了。其他任何东西都是意见、简化或谎言。简短的回答是“这就是标准化的,这就是我们使用它的原因”。我怀疑那会满足。 OP需要几分钟吗?当时委员会成员的回忆? -
@Yakk - Unicode 不是一个选项,因为 C++ 是在人们主要使用 ASCII 进行编程时设计的。因此,只有括号或 {} 或 [] 具有替代匹配符号,并且它们至少都有同样的问题。
-
值得指出的是,D 使用了
TemplatedType!(T),它没有歧义问题,因为在 C++ 中没有二进制的!。
标签: c++ c++11 language-design template-meta-programming