繁体   English   中英

函数模板重载clang ++

[英]function template overloading 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)
}

我无法弄清楚哪个变体是正确的(C ++ 03)。

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

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

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

在C ++中没有像通用“指针”这样的东西......你有指向函数的指针,指向对象的指针或指向成员的指针。 三者中的每一个都有不同的规则,与其他规则不相容。

无可否认,空指针会引起一些混乱......

我试图把它作为一个bug提交给llvm bugzill。 答案是:

这是一个GCC错误。 看到:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM