разруливает перегрузку, но перегрузка только по возвращаемому типу же запрещена
у тебя по факту нет перегрузки. у тебя просто останется один шаблон, второго просто не будет. свинка при раскрытии с ошибкой выкидывает (отключает) шаблон из работы и рассмотрения.
А как оно(std::enable_if) это делает, в таком случае?
Вроде он в "неправильной" ветке обращается к члену ::type у структуры, в которой такого члена нет
Ну я не педагог, лучше почитать про SFINAE (свинку) в вики или еще где. само написание enable_if рассмотрено в книге: Шаблоны С++ справочник разработчика 2ed 2018 - Вандервуда. Смысл такой что в компиляторе ошибочное раскрытие шаблона - не является ошибкой, чтобы во время подбора (лучшего варианта) не отвалится при не удачной попытке поиска. На этом и построена Свинка, enable_if раскрывается в правильный(удачный) или не правильный(не удачный) шаблон. не удачный приводит к тому что весь шаблон (функция, метод, класс) оказывается ошибочным и он исключается из рассмотрения. и компилятор продолжает работу дальше. НО ты этим финтом как бы отключил (выкинул) не нужную функциональность (функцию, метод, класс), тем самым оставив нужную.
Почитай про SFINAE Ошибка при инстанцировании шаблона не вызывает ошибку компиляции, а просто выкидывает перегрузку из рассмотрения std::enable_if<false>::type не существует, обращение к нему -- ошибка
Обсуждают сегодня