13

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)。

4

2 回答 2

6

指向函数的指针不是指向对象的指针,在 C++ 中谈论const指向函数的指针是没有意义的。

IMO g++ 是正确的,因为hex它可以作为指向函数的指针,但不能作为const *指向任何东西的指针。

在第一种情况下,模板参数不是“指针”而是“指向对象的指针”。

C++ 中没有通用“指针”之类的东西……你有指向函数的指针、指向对象的指针或指向成员的指针。三者各自有不同的规则,并且与其他的不相容。

诚然,空指针会带来一些混乱......

于 2013-10-02T06:49:31.743 回答
4

我试图将此作为错误提交给 llvm bugzill。答案是:

这是一个 GCC 错误。看:

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584

于 2013-10-10T04:59:21.803 回答