Здравствуйте, collider, Вы писали:
C>Почему 1-й вариант в отличие от 2-го не компилируется? C>В чем разница?
В первом варианте две шаблонные функции отличаются только значениями по умолчанию у одного из шаблонных параметров. Т.е. имеют одинаковые прототипы и с точки зрения механизма перегрузки идентичны.
Во втором случае у шаблонных функций отличаются возвращаемые значения, что делает их различимыми с точки зрения механизма перегрузки (точнее, специальных правил перегрузки шаблонных функций, описанных в параграфе 14.5.6.1 Function template overloading [temp.over.link] стандарта).
Здравствуйте, Constructor, Вы писали:
C>Здравствуйте, collider, Вы писали:
C>>Почему 1-й вариант в отличие от 2-го не компилируется? C>>В чем разница?
C>В первом варианте две шаблонные функции отличаются только значениями по умолчанию у одного из шаблонных параметров. Т.е. имеют одинаковые прототипы и с точки зрения механизма перегрузки идентичны. C>Во втором случае у шаблонных функций отличаются возвращаемые значения, что делает их различимыми с точки зрения механизма перегрузки (точнее, специальных правил перегрузки шаблонных функций, описанных в параграфе 14.5.6.1 Function template overloading [temp.over.link] стандарта).
Честно говоря звучит как то не очень убедительно.
Во 2-м варианте шаблонные функции не отличаются возвращаемым типом. Он просто валиден только в одной функции для каждой конкретной специализации.
То есть если в для каждой специализации в 1-м варианте существует один валидный вариант- то какие проблемы вызвать его?
Я тут случайно набрел на реализацию std::pair в VS 2015
Ну так там примерно такое же колдовство, только почему то оно работает )
Здравствуйте, collider, Вы писали:
C>Во 2-м варианте шаблонные функции не отличаются возвращаемым типом.
С т.з. компилятора отличаются.
C>Он просто валиден только в одной функции для каждой конкретной специализации.
Об этом компилятор узнает только в тот момент, когда начнет перебирать эти перегрузки, чтобы подобрать нужную.
C>Я тут случайно набрел на реализацию std::pair в VS 2015 C>Ну так там примерно такое же колдовство, только почему то оно работает )
Присмотритесь внимательнее, это колдовство использует std::enable_if_t не только для задания значения по умолчанию для 3-го шаблонного параметра, но и для задания типа 4-го параметра (который является параметром-нетипом со значением по умолчанию, равным 0). Т.е. у двух шаблонных перегрузок конструктора std::pair отличаются прототипы. Ничто не мешает и Вам использовать такую технику на грани фантастики.