g++ 4.8.1和clang++ 3.4给出了下一个代码的不同结果:
// simplified code from a Logger module
#include <iostream>
template<class T> void tf(const T*) { // clang++
std::cout << "void tf(const T*)\n";
}
template<class T> void tf(T) { // g++
std::cout << "void tf(T)\n";
}
int main(){
typedef std::ios_base& (*ph)(std::ios_base&);
ph p = std::hex;
tf(p); // or just tf(std::hex)
}我不知道哪个变体是正确的(C++ 03)。
发布于 2013-10-10 04:59:21
我试着把这个当成错误提交给llvm bugzill。答案是:
这是GCC的窃听器。请参见: active.html#1584
发布于 2013-10-02 06:49:31
函数指针不是指向对象的指针,在const中谈论函数指针的-ness在C++中是没有意义的。
IMO g++是对的,因为hex是函数的指针,而不是指向任何东西的const *。
在第一种情况下,模板参数不是“指针”,而是“指向对象的指针”。
在C++中没有一个通用的“指针”.您有函数的指针、对象的指针或成员的指针。这三者都有不同的规则,而且与其他规则不相容。
不可否认的是,空指针会带来一些混乱.
https://stackoverflow.com/questions/19131309
复制相似问题