为什么两个函数具有相同的地址?

Naw*_*waz 6 c++ templates function memory-address function-templates

考虑这个功能模板:

template<typename T>
unsigned long f(void *) { return 0;}
Run Code Online (Sandbox Code Playgroud)

现在,我打印的地址f<A>f<B>为:

std::cout << (void*)f<A> << std::endl;
std::cout << (void*)f<B> << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果在MSVS10中编译,为什么它们会打印相同的地址?它们不是两个不同的功能,因此应该打印不同的地址吗?

更新:

我意识到在ideone上,它会打印出不同的地址.MSVS10优化代码,因为函数不依赖T于任何方式,因此它产生相同的功能.@Mark的回答和对此的评论很有价值.:-)

bdo*_*lan 7

你需要施放到void *:

std::cout << (void*)(ftype*)f<A> << std::endl;
std::cout << (void*)(ftype*)f<B> << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果你投一个函数指针(或其他几类非空指针),它会被解释为booloperator<<用于std::ostream(因此1).


Mar*_*som 2

由于该函数不依赖于模板参数,因此编译器可以将所有实例化压缩为单个函数。

我不知道你为什么要找1这个地址。


由纳瓦兹添加:

我用我的真实代码进行了实验,并得出结论,@Mark 上面所说的在这里非常重要:

由于该函数不依赖于模板参数,因此编译器可以将所有实例化压缩为单个函数。

我还得出一个结论,如果函数体依赖于T*,而不是依赖于T,它仍然会在我的真实代码中为不同类型的参数生成相同的函数(尽管不是在 ideone 上)。但是,如果它依赖于T,那么它会产生不同的函数,因为sizeof(T)不同类型的参数会有所不同(对我来说幸运的是)。

所以我在函数模板中添加了一个类型的虚拟自动变量 T,这样函数就可以依赖于 的大小T,从而强制它产生不同的函数。