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