Почему использование неэффективной концепции считается плохо сформированным - PullRequest
2 голосов
/ 03 марта 2020

В новых опубликованных черновиках упоминается в [expr.prim.req] / 6 :

Если замена аргументов шаблона на требование будет всегда приводит к сбою замещения, программа плохо сформирована; Диагностика не требуется c. [ Пример:

template<typename T> concept C =
requires {
  new int[-(int)sizeof(T)];     // ill-formed, no diagnostic required
};

- конец примера ]

Но почему мы не можем гарантировать диагностику c до всегда терпеть неудачу, а не пропускать диагностику c?

1 Ответ

6 голосов
/ 03 марта 2020

Выражения требований могут делать что угодно. Они могут спровоцировать дальнейшие замены шаблонов, каскадно проходящие через произвольное количество кода. И помните, что подстановки шаблонов составляют Turning complete language .

Итак, вы просите компилятор, учитывая полную программу Тьюринга, доказать, есть ли какие-то входные данные, которые вызывают эту программу хорошо сформирован. Это просто повторение проблемы остановки. Как и в случае с проблемой остановки, существуют простые случаи, когда очевидно, что программа останавливается / не останавливается. Но когда вы имеете дело с языком, полным по Тьюрингу, он может быть сколь угодно сложным.

Стандарт не заставит компиляторы решать проблему остановки.

...