int main(){
auto func1 = [](int y) {
cout << y << " ";
};
auto func2 = [](int y) {
cout << y * y << " ";
};
cout << "func1 is : " << typeid(func1).name() << endl;
cout << "func2 is : " << typeid(func2).name() << endl;
cout << "main is : " << typeid(main).name() << endl;
}
OSX输出:
func1是:Z4mainE3 $ _0
func2是:Z4mainE3 $ _1
主要是:FivE
有人可以解释输出吗?
谢谢,我正在探索一些c ++ 11的功能。
答案 0 :(得分:1)
您在这里看到的是每个符号的name mangled name。这是编译器实现返回的typeid.name()
。并不要求受损的名称与您的代码直接相关。使用已存在于目标文件中的已损坏符号名称进行链接是一种方便的实现选择。
您可以使用c++filt
工具取消名称:
因此:
$ c++filt _FivE
产量
int ()
换句话说,一个返回int的函数。请记住,您要求的是函数的类型,而不是名称。
如果您要将其应用于课程
class foo
{
};
cout << "foo is : " << typeid(foo).name() << endl;
您会发现输出为3foo
,且无名称为foo
。
这两个羔羊不会发痒。这是因为它们是匿名函数,所以不需要外部名称。
此外,编译器为每个lambda生成一个仿函数类。第一个看起来像
struct Z4mainE3
{
void operator()(int y)
{
cout << y << " ";
}
}
这意味着每一种都是不同的类型。该名称是合成的,由编译器生成,不会与其他任何内容发生冲突。
typeid
运算符将对functor结构进行操作,而不是lambda本身的明显返回和参数类型,因此它们中的两个是不同的类型,尽管显然是具有相同签名的函数。
关于typeid().name()
运营商的长期建议是它不便携;你should not rely on the values回来了。