Не так давно требующие выражения (фраза, введенная вторым требует) не допускалась в ограничительных выражениях (фраза, введенная первым требует). Это могло появиться только в определениях понятий. Фактически, это именно то, что предлагается в разделе той статьи, где появляется это утверждение.
Однако в 2016 году было предложено ослабить это ограничение [Примечание редактора: P0266]. Обратите внимание на зачеркнутый абзац 4 в разделе 4 статьи. И таким родился требует требует.
По правде говоря, я никогда не реализовывал это ограничение в GCC, так что это всегда было возможно. Я думаю, что Уолтер, возможно, обнаружил это и нашел его полезным, что привело к этой статье.
Чтобы никто не подумал, что я неуязвим к написанию требований дважды, я потратил некоторое время, пытаясь определить, можно ли это упростить. Короткий ответ: нет.
Проблема в том, что после списка параметров шаблона необходимо ввести две грамматические конструкции: очень часто выражение ограничения (например, P && Q
) и иногда синтаксические требования (например, requires (T a) { ... }
). Это называется требованием-выражением.
Первое требование вводит ограничение. Второй требует вводит выражение requires. Так складывается грамматика. Меня это совершенно не смущает.
В какой-то момент я попытался свести их к одному требованию. К сожалению, это приводит к серьезным трудностям при синтаксическом анализе. Вы не можете легко сказать, например, если (
после требования обозначает вложенное подвыражение или список параметров. Я не верю, что существует идеальное устранение неоднозначности этих синтаксисов (см. Обоснование единого синтаксиса инициализации; эта проблема тоже существует).
Итак, вы делаете выбор: make требует ввести выражение (как сейчас) или заставить его ввести параметризованный список требований.
Я выбрал текущий подход, потому что большую часть времени (как и почти 100% времени) мне нужно что-то другое, кроме выражения requires. И в чрезвычайно редком случае мне нужно было выражение requires-expression для специальных ограничений, я действительно не возражаю написать это слово дважды. Это очевидный показатель того, что я не разработал достаточно прочную абстракцию для шаблона. (Потому что, если бы это было так, у него было бы имя.)
Я мог бы выбрать, чтобы в требованиях вводилось выражение-требование. Это на самом деле хуже, потому что практически все ваши ограничения начнут выглядеть так:
template<typename T>
requires { requires Eq<T>; }
void f(T a, T b);
Здесь второе требование называется вложенным требованием; он оценивает свое выражение (другой код в блоке выражения required не оценивается). Я думаю, что это намного хуже, чем статус-кво. Теперь вам нужно писать везде, где требуется дважды.
Я мог бы также использовать больше ключевых слов. Это проблема сама по себе - и это не просто потеря велосипеда. Возможно, существует способ «перераспределить» ключевые слова, чтобы избежать дублирования, но я не задумывался об этом серьезно. Но сути проблемы это не меняет.
requires
можно использовать для метода класса шаблона, и это будет неоднозначноtemplate <typename T> struct S {void f(T t) requires requires (T x) {x + x;} { t + t;} };
- person Jarod42   schedule 15.01.2019noexcept(noexcept(...))
. - person Quentin   schedule 15.01.2019noexcept
есть двусмысленность.noexcept(f())
может означатьnoexcept
, еслиf()
оценивается как истина или еслиf()
равноnoexcept
. - person Passer By   schedule 15.01.2019requires
может иметь любой предикат constexpr, не так ли? - person StoryTeller - Unslander Monica   schedule 15.01.2019requires
, он знает, что следующий символ является требованием, поэтому нам нужен дополнительныйrequires
, чтобы сообщить ему, что ему нужно проанализировать это требование как специальное. - person NathanOliver   schedule 15.01.2019requires
являются омонимами: они выглядят одинаково, пишутся одинаково, пахнут одинаково, но по сути различны. Если бы я предложил решение, я бы предложил переименовать одно из них. - person YSC   schedule 15.01.2019add<T>()
требуетT
, который, в свою очередь, требует добавления возможности к другимT
. Так что, хотя это выглядит повторяющимся, это имеет смысл, если вы достаточно об этом думаете. (Где я должен быть добавляемым - это выражение, а функции нужно что-то, что должно быть добавлено, - это ограничение.) - person Justin Time - Reinstate Monica   schedule 15.01.2019