Добавление понятий в 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++ как можно скорее.
А по понятиям…. как я уже много раз говорил…
мда