Добавление понятий в C++20 может быть ошибкой. И мы, вероятно, никогда не узнаем, было ли это ошибкой. 😃

Отказ от ответственности

В этой статье нет слов «ага-момент», «да-момент» или «о нет». Итак, если вы ожидаете, что я предупрежу вас, чтобы вы сломались; в настоящее время.

Эта статья может быть сжата (в соответствии с моими общими чувствами к Концепциям) до:

мда

Плохие концепции

Здесь я перечислю свои претензии Festivus к концепциям C++.

Психология

Если вы закатываете глаза при мысли, что я играю доктора CPPhil, я понимаю.

Сделай мне одно одолжение, прежде чем уйти. Прочтите это про Понятия бумага. Если вы не собирались уходить, вы также можете прочитать газету. Удивительно, сколько в нем рационализаций и размахивания руками.

И дело не только в этой статье, Концепты так долго раскручивались и люди так долго над ними работали, что понятно, что они не в состоянии объективно оценить их преимущества. Обратите внимание, что это не означает, что люди, работающие над концепциями, не умны. Так и есть, но умные люди подвержены предубеждениям и эгоизму. Вам это может показаться смешным, но если бы вы работали над чем-то 10–15 лет, думаете, вы были бы объективны? Нет. Этот парень D должен быть неправ!

Отказ от ответственности: очевидно, что Александреску не является невинным сторонним наблюдателем, поскольку он работает над D, а D имеет статичность, если эта концепция Бьярне заблокировала попадание в C++.

Математика

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

  • формальная верификация против TDD, фаззинга, дезинфицирующих средств…
  • Waterfail против Agile
  • очень умные системы, основанные на правилах, против машинного обучения
  • Haskell против любого языка программирования 😉

Во всех этих случаях побеждали «хромые», «нечистые» подходы. Концепции могут решать проблему, которую нельзя решить с помощью математики. Очевидно, это всего лишь предположение, но я помню, как Бьерн рассказывал историю о том, как он был недоволен, когда обсуждал тот факт, что неудачные концепции C++0x содержали более 100 концепций для стандартной библиотеки.

Так что, может быть, просто типы IRL имеют гораздо меньше общего, чем вы думаете, основываясь на реализации std::find или прочитав «Элементы программирования».

Устаревший код оставлен позади

AFAIK Concepts не принесет никакой пользы существующим кодовым базам. Под этим я подразумеваю, что если вы включите заголовок, который содержит какой-то старый код шаблона, и заголовок, в котором указана концепция RandomAccessIterator, компилятор не скажет вам, что ваш код будет скомпилирован, если вашим аргументом был RandomAccessIterator. Это не то чтобы удивительно, так как компилятор проверяет не определение шаблона, а только подпись, но человек может помечтать…

требует требует

Мне буквально сложно что-то написать об этом. Если вы думаете, что требует, требует, это не мерзость, ИДК, как вас преобразовать, если вы это сделаете, я не хочу тратить ваше время. Итак, давайте двигаться дальше.

Пока вы стандартизировали… проблемы решались путем стандартизации чего-то другого

Есть еще много проблем, которые Концепции облегчат решение.

Но static_assert и if constexpr — это способ решить некоторые проблемы, которые должны были решить Concepts (10+ лет назад).

Таким образом, выигрыш от стандартизации понятий меньше, чем в C++ 11/14.

О, и ошибки компилятора немного улучшились за последние 10 лет.

Кстати, о сообщениях об ошибках

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

Хорошие концепции

Есть некоторые вещи, которые мне нравятся в концептах.

Какой код вместо того, как код

Как и в случае с requires, это трудно объяснить, поскольку вы либо соглашаетесь со мной, либо нет.

На мой взгляд, std::enable_if и std::void_t — уродливые хаки, которые (хотя они не являются чисто How Code, поскольку у вас есть признаки типа is_bla) выглядят ужасно по сравнению с Concepts.

Я имею в виду template‹bla bla› void func(… должно означать, что типы, используемые func, перечислены в части bla bla. Но в настоящее время bla bla также является домом для enable_if (что приводит к потенциальному удалению этой перегрузки func из набора перегрузок на основе на некоторый предикат времени компиляции).

Удаление этих уродливых хаков из библиотек — буквально единственная функция Concepts, которую я люблю безоговорочно.

Задержки в деталях, дьявол в невидимом

Это будет одна из тех вещей, которые вы узнаете из своего опыта, или вам просто нужно будет довериться мне. 😉

Часто, когда обсуждается сложный дизайн, люди склонны спорить о деталях, которые, в конце концов, оказываются менее чем важными, и проблемы IRL возникают из-за использования, о котором люди, разрабатывающие эту функцию, не думали. Вот почему умные люди придумали такие вещи, как «минимально жизнеспособный продукт», «запуск и итерация»… И хотя стандарт имеет досадное ограничение обратной совместимости, поэтому экспериментировать нелегко, принцип, лежащий в основе MVP, остается неизменным: трудно заранее знать, как будет реализована функция. используется/принято.

Так что вполне возможно, что все «качественное время», потраченное на споры о концепциях, было в основном пустой тратой времени, и что большая часть полезной обратной связи будет получена от концепций TS, реализованных в основных компиляторах. Так что есть шанс, что большинство «проблем», обсуждаемых во время проектирования, так и останутся теоретическими.

Концепции могут сделать крутые библиотеки доступными

Логика проста:

легче сделать крутую библиотеку => больше крутых библиотек

Концепции могут перенастроить наш мозг в лучшую сторону

Концепции в исходном коде могут быть просто математическим спамом, но на самом деле они могут изменить то, как мы думаем о коде. К лучшему.

Это весьма спекулятивно. 😃

Концепции могут дать нам лучшие сообщения об ошибках

А может и нет. 😕

Оценка успеха

Если вы помните, я сказал вам во вступлении, что мы никогда не узнаем, был бы C++ лучше без понятий. Почему я так уверен в этом?

Потому что история бывает только один раз. Другими словами, у нас нет хорошего способа проверить эволюцию языка, компиляторов, онлайн-документацию, StackOverflow, будущие стандарты… в двух вселенных (C++ с концепциями и без них).

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

И маловероятно, что доказательства будут так подавляюще поддерживать одну сторону, поэтому мы будем жить в этом мире, где ваша предвзятость подтверждения позволяет вам жить в иллюзии, что ваши убеждения основаны на данных. 😜

Мех ака Заключение

У C++ есть проблемы с деньгами (несмотря на то, что над ним работает огромное количество людей, у них есть «настоящая работа»), и несправедливо судить о концепциях по тем же стандартам, которые вы применяли бы, скажем, к добавлению языка Swift. Если бы мы были концепциями, это было бы полной катастрофой.

Обратите внимание, что это не я жалуюсь на «злые» корпорации, корпорации существуют, чтобы делать деньги, но я хочу, чтобы Цуки и Билли (филантропы) всего мира заметили, что улучшение C++ будет ценным вложением в человечество. Это не сарказм.

Вернемся к понятиям. Я рад, что они есть в C++20, главным образом потому, что тогда ISO сможет, наконец, перейти к некоторым другим вещам (хотя они все еще будут немного работать над дополнением к концепциям, стандартизируя некоторые вещи, разблокируя некоторые другие вещи).

Я хочу, чтобы мои драгоценные диапазоны ❤️ были написаны на C++ как можно скорее.

А по понятиям…. как я уже много раз говорил…

мда