The Itanium ABI указывает, что с несколькими неинтересными исключениями тип возврата включается в искаженные имена шаблонных экземпляров, но не не-шаблоны.
Почему это? В каком случае у вас может быть два экземпляра шаблонов функций, в которых линкер должен различать их, потому что это не указывает на нарушение правил одного определения или подобное?
В качестве примера я имею в виду:
class ReturnType {};
class ParamType {};
template <typename T>
ReturnType foo(T p) {
return ReturnType();
};
template ReturnType foo<ParamType>(ParamType);
ReturnType bar(ParamType p) {
return ReturnType();
}
Тогда в результирующем объектном файле есть manglings:
ReturnType foo<ParamType>(ParamType)
=> _Z3fooI9ParamTypeE10ReturnTypeT_
^^^^^^^^^^^^
ReturnType bar(ParamType)
=> _Z3bar9ParamType
Почему foo
нужен ReturnType
искаженный, но bar
не работает?
(Я предполагаю, что есть причина, и это не просто произвольный выбор.)