gpt4 book ai didi

c++ - 为什么 C++ 函数模板实例化的返回类型包含在损坏的函数名称中?

转载 作者:IT老高 更新时间:2023-10-28 21:42:04 36 4
gpt4 key购买 nike

安腾 ABI specifies即,除了一些无趣的异常(exception),返回类型包含在模板实例的错位名称中,但不包含在非模板中。

这是为什么?在什么情况下你可以有两个函数模板实例,链接器需要区分它们,因为它并不表示违反单一定义规则或类似情况?

作为我的意思的一个例子:

class ReturnType {};
class ParamType {};

template <typename T>
ReturnType foo(T p) {
return ReturnType();
};
template ReturnType foo<ParamType>(ParamType);

ReturnType bar(ParamType p) {
return ReturnType();
}

然后生成的目标文件有修改:

ReturnType foo<ParamType>(ParamType)
=> _Z3fooI9ParamTypeE10ReturnTypeT_
^^^^^^^^^^^^

ReturnType bar(ParamType)
=> _Z3bar9ParamType

为什么 foo 需要 ReturnType 错位而 bar 不需要?

(我假设这是有原因的,这不仅仅是一个随意的选择。)

最佳答案

也许是因为,与普通函数相反,函数模板签名包含返回类型? §1.3:

1.3.17 signature <function> name, parameter type list (8.3.5), and enclosing namespace (if any)
[ Note: Signatures are used as a basis for name mangling and linking.end note ]


1.3.18 signature <function template > name, parameter type list (8.3.5), enclosing namespace (if any), return type, and template parameter list

假设我们可以有两个完全不同的函数模板重载,它们的返回类型不同,如果这样写的话:

template <int>
char foo();

template <int>
int foo();

如果名称修改不考虑返回类型,那么链接这些模板会很困难,因为 foo<0>没有唯一地命名一个专业。不过,可以使用重载解析(不带参数)来解决一种专门化问题:

int (*funptr)() = foo<0>;   

另一方面,普通函数不需要包含返回类型,因为它们不能在其返回类型上重载 - 即它们的签名不包含返回类型。

关于c++ - 为什么 C++ 函数模板实例化的返回类型包含在损坏的函数名称中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30057635/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com