Я читаю «C ++ 17 Полное руководство» от Josuttis, и он упоминает в ранней главе, что полные специализации шаблонов должны иметь одинаковую подпись и тип возврата, потому что специализации-это только реализации, а не новые объявления. Он показывает эти два примера, которые я упростил. Я также проверил, чтобы убедиться, что они работают так же в C ++ 23.
Код: Выделить всё
using namespace std::literals;
template auto func1();
template auto func1() { return "1"s; }
template auto func1() { return 1; }
< /code>
не снимается: < /p>
using namespace std::literals;
template auto func2();
template std::string func2() { return "1"s; }
template int func2() { return 1; }
< /code>
Он не предлагает дополнительных объяснений или ссылок на другие части книги. < /p>
Это смутило меня; Насколько я понимаю, в успешном примере Func1
должен иметь свой тип возврата, выведенный в STD :: String и func1 к int . Но тогда у нас будет та же проблема, что и во втором примере. Итак, как func1 успешно скомпилируется? Разве его специализации не имеют разных типов возврата? Он приводит еще один пример, который успешно компилируется (модифицировано в соответствии с более ранними примерами): < /p>
Код: Выделить всё
using namespace std::literals
using types = std::tuple;
template auto func3() -> std::tuple_element_t;
template std::string func3() { return "1"s; }
template int func3() { return 1; }
Это имеет смысл для меня, и он показывает мне механизм, с помощью которого компилятор может получить func1 для компиляции: вывести типы возврата специализаций для строки и int , затем вывести общий тип возврата шаблона, чтобы зависеть от его параметра шаблона с чем -то вроде Tuple_element_t . Однако, если компилятор смог сделать этот второй шаг, я не вижу причин, по которой он не сможет использовать его для func2 . Почему это не может быть сделано для func2 ?
Подробнее здесь:
https://stackoverflow.com/questions/796 ... return-typ