Пример:
template<typename T>
concept SequenceContainer = Container<T> && requires (T a)
{
{ a.front() } -> typename T::reference;
/* requirements */
};
Здесь мы требуем, чтобы тип возвращаемого значения был неконстантной ссылкой. Но если a имеет тип const T - очевидно, правильно добавить дополнительное требование, указав, что "если a имеет тип const T, то вызов член-функции front() должен вернуть const_reference":
template<typename T>
concept SequenceContainer = Container<T> && requires (T a, const T b)
{
{ a.front() } -> typename T::reference;
{ b.front() } -> typename T::const_reference;
/* requirements */
};
Вопрос: существует ли способ не указывать второй параметр - const T b, а каким-то образом сообщить, что в данном требовании тип a следует рассматривать как const T? Я не нашел ничего подходящего ни на en.cppreference.com, ни на eel.is.
Т.е., в идеале хотелось бы что-то вроде:
{ a.front() const } -> typename T::const_reference;
Если такого способа нет и нужно делать так, как описано выше (второй параметр с типом const) - при возможности поделитесь ссылкой на соответствующий пункт в стандарте (я про черновик, разумеется).
В голову приходит несколько вариантов:
std::as_const(a).front()
std::declval<const T &>().front()
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости