Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么两个函数有相同的地址?_C++_Function_Templates_Memory Address_Function Templates - Fatal编程技术网

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

C++ 为什么两个函数有相同的地址?,c++,function,templates,memory-address,function-templates,C++,Function,Templates,Memory Address,Function Templates,考虑以下函数模板: template<typename T> unsigned long f(void *) { return 0;} 模板 无符号长f(void*){返回0;} 现在,我将f和f的地址打印为: std::cout << (void*)f<A> << std::endl; std::cout << (void*)f<B> << std::endl; std::cout您需要强制转换为void

考虑以下函数模板:

template<typename T>
unsigned long f(void *) { return 0;}
模板
无符号长f(void*){返回0;}
现在,我将
f
f
的地址打印为:

std::cout << (void*)f<A> << std::endl;
std::cout << (void*)f<B> << std::endl;

std::cout您需要强制转换为
void*

std::cout << (void*)(ftype*)f<A> << std::endl;
std::cout << (void*)(ftype*)f<B> << std::endl;

std::cout由于函数不依赖于模板参数,编译器可以将所有实例化压缩为单个函数

我不知道你为什么会得到地址
1


增加人:
我尝试了我的真实代码,并得出结论,@Mark上面所说的在这里非常重要:


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

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

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

这只是未定义行为的一种情况,因为将指向函数的指针强制转换为指向对象类型的指针的结果是未定义的


要检查的一个更有趣的表达式是
f==f
,当且仅当
A
B
引用同一类型时,该表达式应计算为
true

如果我将其转换为
void*
,则会产生编译错误。另外,如果我改为转换到
ftype*
,也没关系。@Nawaz:你需要先转换到
(ftype*)
,然后再转换到
(void*)
,例如
std::cout@nicolas:浏览链接。单击问题中的。标准是否规定函数必须具有唯一的地址?我认为他们会将其保留为完全未定义(实现已定义)以允许编译器优化。当然,如果您将函数体更改为依赖于模板类型,函数将不再相同。@MarkRansom:但根据您的说法,它仍然是相同的函数,当它打印
1
时@bdonlan的答案似乎是正确的。我建议,即使您遵循bdorian的建议,您仍将获得相同的地址,除非函数的签名或函数体在某种程度上依赖于模板参数。您的原始函数体不依赖于模板参数,但您的第二个版本依赖于模板参数。我用我的真实代码进行了实验,并得出结论:由于函数不依赖于模板参数,编译器可以将所有实例化压缩为单个函数。我还得出一个结论,如果函数体依赖于
T*
,而不是
T
,它仍然会产生相同的函数。但是,如果它依赖于
T
,那么它会产生不同的函数,因为
sizeof(T)
对于不同类型的参数是不同的(幸运的),这是有疑问的。证据在哪里?