Bjarne Stroustrup недавно опубликовал report на концепциях C++, где он упоминает то, что мне показалось удивительным. Пример (в разделе 7.1) использует «сокращенный шаблон обозначения» и, по сути выглядит следующим образом:C++ Понятия с несколькими аргументами шаблона
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)
Для меня лично, это кажется очень нелогичным; на самом деле, я ожидал бы, что foo2 примет значения x, y разных типов, если соответствующие типы удовлетворяют SomeConcept. Обратите внимание, что программист всегда может явно указать свое намерение, написав одно из следующих действий:
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, общие лямбды (в C++ 14) уже позволяют синтаксис похож на (1). Следовательно, согласованность диктует, что (1) должен принимать входные переменные с разными типами, поскольку общие лямбды делают это.
- Struustrup упоминает классическую «пару итераторов» в контексте таких шаблонов. Тем не менее, я считаю, что это довольно слабый аргумент, поскольку (i) это всего лишь один случай использования и (ii) afaik, C++ 17 вводит пары (итератор, дозорный), что заставляет общий код использовать два разных типа в любом случае ,
Согласен, что это противоречит интуиции. Я действительно очень хочу * сокращенный синтаксис *, если он позволяет разные типы для одних и тех же понятий. –
Обратите внимание, что документы в основном представляют собой взгляды автора, не обязательно относящиеся к комитету. И я думаю, что комитет далеко не единодушно относится к концепциям (как вы можете видеть, глядя на прошлые рассылки). То, что в конечном итоге произойдет, еще предстоит выяснить; то, что вы ищете, - это движения комитета, которые прошли. –
То же правило указано в текущей версии Концепций TS (§8.3.5, с.22): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4641 .pdf –