}
float get() { return 10.1f; }
а так работает
template<class T> T get() {}
template<> int get() { return 10; }
template<> float get() { return 10.1f; }
получается, при инстанцировании шаблона функция получает какое-то другое имя, в зависимости от возвращаемого параметра?
В зависимости от параметра шаблона, получается :) Возвращаемое значение само по себе не может отличать две функции.
то есть в приведённом случае эти специализации не являются перегрузками? а в следующем случае, являются? template<class T> void set(T) {} template<> void set(int ) {} template<> void set(float) {}
так нельзя перегружать: ``` int get(); float get() ``` Так можно: ``` int get(int); float get(float) ```
помойму тут суть в том что у функций есть перегрузки а у шаблонов есть спецификации\специализации суть одно и то же но для различия в разговоре и тексте для понимания о чем идет речь существуют разные термины
нет, это разные механизмы и специализации лучше не пытаться использовать как перегрузки, потому что они иначе работают
я имею в виду что при таких тривиальных примерах они крайне похожи но да под капотом совсем другие механики
Когда у вас две функции отличаются только возвращаемым значением, они получат одно и то же имя в бинарнике, конфликт возникнет. А когда функции еще и принадлежат разным классам/неймспейсам/специализациям шаблонов, все ок - эти детали будут учтены в конечном имени функции. https://en.wikipedia.org/wiki/Name_mangling
Обсуждают сегодня