В списках обязательных параметров вы можете ввести типы, которые приводят к ошибкам замещения?
Например, могу ли я определить понятие как
template <class Iter>
concept bool Iterator =
requires(Iter i, typename std::iterator_traits<Iter>::value_type val,
typename std::iterator_traits<Iter>::reference ref) {
++i;
// other implementation
};
С gcc 6 этот код будет компилироваться, но что-то вроде Iterator<int>
также приведет к true
даже если val
а также ref
были бы сбои замены. Это то, что он должен делать?
1 ответ
Используя последний общедоступный черновик N4377, это параметризованное ограничение ([temp.constr.param]):
Параметризованное ограничение - это ограничение, которое объявляет последовательность параметров (8.3.5), называемых переменными ограничения, и имеет один операнд. [ Примечание: параметризованные ограничения вводятся с помощью выражения-требования s (5.1.4). Переменные ограничения параметризованного ограничения соответствуют параметрам, объявленным в списке параметров- требований выражения require, и операнд ограничения является соединением ограничений. - конец примечания ]
И этот раздел явно рассматривает сбои подстановки для переменных ограничения ([temp.constr.param]/2):
Параметризованное ограничение удовлетворяется, если и только подстановка в типы его переменных ограничения не приводит к недопустимому типу, а его операнд удовлетворяется. Аргументы шаблона подставляются в объявленные переменные ограничения в том порядке, в котором они были объявлены. Если подстановка в переменную ограничения завершается неудачно, больше никаких подстановок не выполняется, и ограничение не выполняется.
Поведение, которое вы наблюдаете, похоже, является ошибкой в реализации.