gru*_*tor 13 c++ templates clang++
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)
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚哪个变体是正确的(C++ 03).
指向函数的指针不是指向对象const的指针,并且在C++中谈论指向函数的指针的含义没有意义.
IMO g ++是正确的,因为它可以hex作为指向函数的指针,但不能作为const *任何东西.
在第一种情况下,模板参数不是"指针"而是"指向对象的指针".
在C++中没有像通用"指针"这样的东西......你有指向函数的指针,指向对象的指针或指向成员的指针.三者中的每一个都有不同的规则,与其他规则不相容.
无可否认,空指针会引起一些混乱......
我尝试将此作为错误提交给 llvm bugzill。答案是:
这是一个 GCC 错误。看:
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |