[...] язык фактически позволяет это?
Не могу ничего сказать об имени, но мне кажется, что да.
Соответствующая формулировка: [temp.alias] / 2 :
Когда template-id относится к специализации шаблона псевдонима, он эквивалентен связанному типу, полученному путем замены его template-arguments на шаблон -параметры в идентификатор типа шаблона псевдонима.
и правило sfinae, [temp.deduct] / 8 :
Только недопустимые типы и выражения в непосредственном контексте типа функции, ее типов параметров шаблона и его явного спецификатора могут привести к ошибке вывода.
Взятие аргумента типа require_rvalue<T>
ведет себя так, как будто мы подставляем этот псевдоним, который либо дает нам T&&
, либо ошибку замещения - и эта ошибка замещения, вероятно, находится в непосредственном контексте & dagger; замены и, таким образом, является "дружественным к сфине", а не серьезной ошибкой. Обратите внимание, что хотя аргумент по умолчанию не используется, в результате CWG 1558 (правило void_t
) мы получили добавление [temp.alias] / 3 :
Однако, если template-id является зависимым, последующая замена аргумента шаблона по-прежнему применяется к template-id .
Это гарантирует, что мы по-прежнему подставляем аргумент по умолчанию для запуска требуемого сбоя замещения.
Вторая недосказанная часть вопроса заключается в том, может ли это фактически вести себя как ссылка для пересылки. Правило есть в [temp.deduct.call] / 3 :
A ссылка на пересылку - это rvalue-ссылка на неквалифицированный cv параметр шаблона, который не представляет параметр шаблона шаблона класса (во время выведения аргумента шаблона класса ([over.match.class.deduct] )). Если P является ссылкой для пересылки, а аргумент является lvalue, тип «lvalue ссылка на A» используется вместо A для вывода типа.
Является ли шаблон псевдонима с одним параметром шаблона, связанный тип которого является rvalue-ссылкой на его cv-неквалифицированный параметр шаблона, ссылкой для пересылки? Ну, [temp.alias] / 2 говорит, что require_rvalue<T>
эквивалентно T&&
, а T&&
- правильная вещь. Так что возможно ... да.
И все компиляторы рассматривают его как таковой, что, безусловно, является хорошим подтверждением.
<ч />
& dagger; Хотя, обратите внимание на существование CWG 1844 и отсутствие фактического определения для непосредственного контекста, и пример там, который также основан на сбое замещения из аргумента по умолчанию - который Проблемы государств имеют расхождение в реализации.