В списках обязательных параметров вы можете ввести типы, которые приводят к ошибкам замещения?

Например, могу ли я определить понятие как

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):

Параметризованное ограничение удовлетворяется, если и только подстановка в типы его переменных ограничения не приводит к недопустимому типу, а его операнд удовлетворяется. Аргументы шаблона подставляются в объявленные переменные ограничения в том порядке, в котором они были объявлены. Если подстановка в переменную ограничения завершается неудачно, больше никаких подстановок не выполняется, и ограничение не выполняется.

Поведение, которое вы наблюдаете, похоже, является ошибкой в ​​реализации.

Другие вопросы по тегам