Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++;使用指向同一函数的指针作为模板参数是否总是导致相同的实例化?_C++_Templates_Function Pointers - Fatal编程技术网

C++ C++;使用指向同一函数的指针作为模板参数是否总是导致相同的实例化?

C++ C++;使用指向同一函数的指针作为模板参数是否总是导致相同的实例化?,c++,templates,function-pointers,C++,Templates,Function Pointers,我有一个模板函数,将函数指针作为参数,还有一个普通函数,如下所示: template <void()> int foo() {static int c = 0; return ++c;} void bar() {} 模板 int foo(){static int c=0;return++c;} 无效条(){} 如果我理解正确,两个不同的函数指针可以有不同的二进制表示,即使使用它们会调用同一个函数。当它们用作模板参数时,这是否也适用 向foo传递“指向bar的指针”(在不同的时间从

我有一个模板函数,将函数指针作为参数,还有一个普通函数,如下所示:

template <void()>
int foo() {static int c = 0; return ++c;}
void bar() {}
模板
int foo(){static int c=0;return++c;}
无效条(){}

如果我理解正确,两个不同的函数指针可以有不同的二进制表示,即使使用它们会调用同一个函数。当它们用作模板参数时,这是否也适用


foo
传递“指向
bar
的指针”(在不同的时间从不同的地方获取,但调用函数指针将调用
bar
)是否总是调用相同的
foo
实例化?

指向
bar
函数的任何两个指针应相等。从C++ 11中提取规范草案:5.10…两个指针比较相等,如果它们。。。两者都指向相同的函数


因此,我无法想象为什么将不同的指针传递到
bar
会创建
foo
的不同实例,因为每个规范中所有这些指针都是相等的

“如果我理解正确,两个不同的函数指针可以有不同的二进制表示,即使使用它们会调用同一个函数。“你在哪里读到的?@sebastianredl,实际上是这个网站。有人提到,并非所有的位都可以用于函数的地址,或者编译器可能会使用多种方法来存储函数指针。这就是为什么不能在函数指针的二进制表示上可靠地使用关系比较的原因。@Sebastian redl我找到了我读到的答案。它描述了为什么将函数指针复制到char数组并比较字节会导致误判的一些原因。这个答案是关于成员函数指针的,它与普通函数指针有着非常不同的表示形式。用普通函数指针,我希望所有的都是位相等的,尽管C++仍然没有给你这样的保证——它只是保证正常的比较会返回真。(o关于带有成员函数指针非类型模板参数的模板,您的问题同样容易被问到。)