2017-02-23 65 views
19

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 вводит пары (итератор, дозорный), что заставляет общий код использовать два разных типа в любом случае ,
+5

Согласен, что это противоречит интуиции. Я действительно очень хочу * сокращенный синтаксис *, если он позволяет разные типы для одних и тех же понятий. –

+0

Обратите внимание, что документы в основном представляют собой взгляды автора, не обязательно относящиеся к комитету. И я думаю, что комитет далеко не единодушно относится к концепциям (как вы можете видеть, глядя на прошлые рассылки). То, что в конечном итоге произойдет, еще предстоит выяснить; то, что вы ищете, - это движения комитета, которые прошли. –

+0

То же правило указано в текущей версии Концепций TS (§8.3.5, с.22): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4641 .pdf –

ответ

2

Самый ранний документ я мог бы найти, что упоминает краткий синтаксис в контексте нынешнего предложения Концепции является N3580, что в §6.2.2 обеспечивает это логическое обоснование:

Что делать, если нам нужно два аргумента типы одной и той же концепции? Рассмотрим

void sort(Ran p, Ran q); 

Для этого имеет смысл, p и q должны быть того же типа, и это правило. По умолчанию, если вы используете одно и то же имя ограниченных параметров для двух аргументов, типы этих аргументов должны быть одинаковыми. Мы решили сделать повторное использование ограниченного имени параметра, подразумевая «тот же тип», потому что это (в большинстве сред) является наиболее распространенным случаем, и целью здесь является оптимизация для краткой нотации простейшего случая. Кроме того, ограниченным параметром является имя типа и имеющие два типа имен относятся к разным типам в той же области приведет к хаосу.

У Tony van Eerd и Boton Ballo есть предложение, чтобы изменить это значение: P0464. В статье приведены два аргумента в поддержку текущих значений, один похож на один Саттон и др делают, и один ортогональный:

Частота использования
Можно утверждать, что вы не часто хотят функция, которая принимает два аргумента потенциально разных типов, удовлетворяющих одному и тому же понятию без дополнительной взаимосвязи между этими двумя типами.

Взаимодействие с проверкой определения
Также можно утверждать, что это изменение будет способствовать шаблонным авторам писать под затрудненную шаблоны, потому что они предпочитают использовать односложный R foo(ConceptName, ConceptName); форму даже в тех случаях, когда там должен быть дополнительное ограничение на типы параметров. Распространение шаблонов с ограниченным ограничением упростит введение проверки определений, поскольку шаблон с ограниченным ограничением не пройдет проверку определений.


Я не знаком с любым другим аргументом в пользу текущего синтаксиса, но если вы, не стесняйтесь, пишите Тони и Botond для включения в их работе.

+0

Спасибо за ваш ответ. Я действительно нашел предложение Botond некоторое время после моего первоначального вопроса, и я надеюсь, что он получит поддержку комитета. Для меня лично главный аргумент заключается в согласованности с синтаксисом «auto», но, похоже, Botond уже заявляет об этом в своем предложении. –