С++ 11
14.8.2 - Вывод из аргумента шаблона -
[temp.deduct]
7 Подстановка происходит во всех типах и выражениях, которые используются в типе функции и в объявлениях параметров шаблона. Выражения включают в себя не только постоянные выражения, такие как те, которые появляются в границах массива или как аргументы шаблона nontype, но также общие выражения (т.е. Непостоянные выражения) внутри
sizeof
,decltype
и другие контексты, которые допускают непостоянные выражения.
С++ 14
14.8.2 - Вывод из аргумента шаблона -
[temp.deduct]
7 Подстановка происходит во всех типах и выражениях, которые используются в типе функции и в объявлениях параметров шаблона. Выражения включают в себя не только постоянные выражения, такие как те, которые появляются в границах массива или как аргументы шаблона nontype, но также общие выражения (т.е. Непостоянные выражения) внутри
sizeof
,decltype
и другие контексты, которые допускают непостоянные выражения, Подстановка продолжается в лексическом порядке и останавливается, когда встречается условие, которое вызывает отказ вывода.
В добавленном предложении явно указывается порядок подстановки при работе с параметрами шаблона в С++ 14.
Порядок замещения - это то, что чаще всего не уделяется большого внимания. Мне еще предстоит найти один документ о том, почему это имеет значение. Возможно, это потому, что С++ 1y еще не полностью стандартизирован, но я предполагаю, что такое изменение должно было быть введено по какой-то причине.
Вопрос:
- Почему и когда имеет место порядок замены аргумента шаблона?