C++ 使用指向相同函数的指针作为模板参数是不是总是会导致相同的实例化?
Posted
技术标签:
【中文标题】C++ 使用指向相同函数的指针作为模板参数是不是总是会导致相同的实例化?【英文标题】:C++ Will using a pointer to the same function as a template parameter always lead to the same instantiation?C++ 使用指向相同函数的指针作为模板参数是否总是会导致相同的实例化? 【发布时间】:2015-06-16 09:36:06 【问题描述】:我有一个以函数指针为参数的模板函数,以及一个像这样的普通函数:
template <void()>
int foo() static int c = 0; return ++c;
void bar()
如果我理解正确,两个不同的函数指针可以有不同的二进制表示,即使使用它们会调用同一个函数。这也适用于它们用作模板参数的情况吗?
是否将“指向bar
的指针”(在不同时间从不同地方获得,但调用函数指针会调用bar
)传递给foo
总是调用foo
的同一个实例化?
【问题讨论】:
“如果我理解正确的话,两个不同的函数指针可以有不同的二进制表示,即使使用它们会调用同一个函数。”你在哪里读到的? @sebastian redl 这个网站,实际上。有人提到,并非所有位都可能用于函数地址,或者编译器可能使用不止一种方法来存储函数指针。这就是为什么您不能可靠地对函数指针的二进制表示使用关系比较的原因。 @Sebastian redl 我找到了我从中读到的答案。它描述了为什么将函数指针复制到 char 数组并比较字节会给出假阴性的一些原因。 ***.com/a/1328635/4756309 这个答案是关于成员函数指针的,它与普通函数指针有非常不同的表示。对于普通的函数指针,我希望所有的都是按位相等的,尽管 C++ 仍然没有给你这样的保证——它只是保证正常的比较会返回 true。 (OTOH 您的问题可以很容易地被问到带有成员函数指针非类型模板参数的模板。) 【参考方案1】:任何两个指向bar
函数的指针都应该相等。摘自 C++ 11 规范草案:5.10 2 ... 如果两个指针比较相等,则它们 ... 都指向同一个函数。
所以我无法想象为什么将不同的指针传递给bar
会创建foo
的不同实例化,因为所有这些指针在每个规范中都是相等的。
【讨论】:
以上是关于C++ 使用指向相同函数的指针作为模板参数是不是总是会导致相同的实例化?的主要内容,如果未能解决你的问题,请参考以下文章