【发布时间】:2017-02-23 10:41:32
【问题描述】:
Bjarne Stroustrup 最近在 C++ 概念上发表了 report,他提到了一些令我惊讶的事情。该示例(在第 7.1 节中)使用“速记模板表示法”,基本上是这样的:
void foo1(auto x,auto y); // x and y may have different types (1)
void foo2(SomeConcept x,SomeConcept y); // x and y must have the same type (2)
就我个人而言,这似乎非常违反直觉;事实上,只要各自的类型满足 SomeConcept,我希望 foo2 接受不同类型的值 x,y。请注意,程序员始终可以通过编写以下内容之一来明确指定其意图:
template <SomeConcept T> void foo2(T x, T y); // (3)
template <SomeConcept T1,SomeConcept T2> void foo2(T1 x,T2 y); // (4)
直观地说,我希望 (2) 中的简写符号等同于 (4),因此更符合无约束模板 (1) 的含义。有人可以阐明这个问题并解释这个设计决定背后的基本原理吗?
一些备注:
- afaik,通用 lambda(在 C++14 中)已经允许使用类似于 (1) 的语法。因此,一致性要求 (1) 应该接受不同类型的输入变量,因为通用 lambda 可以做到这一点。
- Stroustrup 在此类模板的上下文中提到了经典的“迭代器对”。但是,我认为这是一个相当薄弱的论点,因为 (i) 这只是一个用例,并且 (ii) afaik,C++17 引入了 (iterator, sentinel) 对,这强制通用代码无论如何都要使用两种不同的类型.
【问题讨论】:
-
同意这是违反直觉的。我真的很想要缩写语法,只要它允许相同概念的不同类型。
-
请注意,论文主要代表作者的观点,不一定代表委员会的观点。而且我认为委员会对概念的看法远非一致(从过去的邮件中可以看出)。最终会发生什么还有待观察;您要查找的是已通过的委员会动议。
-
Concepts TS 的当前版本(第 8.3.5 节,第 22 页)中规定了相同的规则:open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4641.pdf
标签: c++ templates c++-concepts