Проверил три основных компилятора, все они позволяют накладывать ограничения на шаблоны псевдонимов, например:
template<class T, std::constructible_from<T> V>
using var_t = std::variant<T, V>;
template<class T, class...Args>
requires(std::constructible_from<T, Args...>)
using tup_t = std::tuple<T, Args...>;
Syntax
Alias declarations are declarations with the following syntax:
using identifier attr (optional) = type-id ; (1)
template < template-parameter-list >
using identifier attr (optional) = type-id ; (2)
Является ли cpprefrence неправильным и ограничения разрешены?
@StoryTeller - Unslander Моника, как шаблон-список параметров допускает предложение requires
?
Зачем тогда вы спрашиваете об ограничениях вообще?
@StoryTeller - Разоблачительница Моника - быть наполовину неправым - это неправильно, не так ли?
Множество путей ведут к тому, чтобы ошибиться. Это случается и тогда, когда слишком много обобщают. Я думаю, вам и cppref просто нужно пойти навстречу.
В cppreference есть третья часть этого определения с предложением requires
, которое правильно отмечено как C++20. Чтобы получить подробный результат с этой страницы, вам необходимо установить для «стандартной версии» значение «diff» вверху страницы. Я предполагаю, что в вашем браузере установлена старая версия. Одни и те же ссылки на cppreference могут восприниматься разными людьми по-разному. Я предполагаю, что «стандартная версия» хранится в файле cookie.
Red.Wave -- хорошая находка
Предпочтение очень хорошее, но не всегда актуальное.
Да, предложение require разрешено в шаблоне псевдонима , это частный случай объявления шаблона . См. temp.alias.
template-declaration:
template-head declaration
template-head concept-definition
template-head:
template < template-parameter-list > requires-clause[opt]
tnx, я подозревал, что компиляторы были правы, а cppreference ошибался
Как именно это неправильно? Перешли ли вы по ссылке рядом с списком параметров шаблона, чтобы узнать, что разрешено, а что запрещено в списке параметров шаблона? Там описаны ограничения.