1

考虑下面的代码:64位G ++ 4.6.3在专用函数模板中不会将long视为long long,尽管它们的大小相同。这是一个错误?

#include <iostream> 
#include <cinttypes> 

template<class T> 
void f(); 

template<> 
inline void f<long long>() { 
    std::cout<<"f<long long>()"<<std::endl; 
} 

int main(int , char**) { 
    std::cout<<"sizeof(long)="<<sizeof(long)<<std::endl; 
    std::cout<<"sizeof(long long)="<<sizeof(long long)<<std::endl; 
    f<int64_t>(); 
    return 0; 
} 

32位G ++ 4.6.3编译此成功并且产生输出:

sizeof(long)=4 
sizeof(long long)=8 
f<long long>() 

在64位ģ编译++ 4.6.3然而产生连接错误:

undefined reference to `void f<long>()' 
ld returned 1 exit status 

即使编译并与f<int64_t>()行注释掉运行产生:

sizeof(long)=8 
sizeof(long long)=8 

是否有一个很好的理由,为什么64位的G ++对待f<long>f<long long>为不同的功能,即使longlong long大小相同,或者这是我应该报告的错误?

回答

7

int64_t的基本类型可以是符合要求的任何东西。可以在一个平台上制作long,在另一个平台上制作long long

既然你long long提供专业化和通用版本没有身体,如​​果int64_t不是long long你会得到一个未定义的参考。

是的,有一个很好的理由f<long>f<long long>有不同的功能:这是因为标准说longlong long是不同的类型。事实上,它们在某个平台上的宽度相同并不重要,尤其是因为它们在另一个平台上的宽度可能不同。

+0

+1提到标准说他们是不同的类型。这是有道理的,因为否则32位G ++将无法使用32位整型长整型和64位整型长整型长整型,但当将使用QT的qint64的代码与使用int64_t的代码混合使用时,会导致恼人的不兼容性,如64位G ++中的qint64 = long long和int64_t = long。不管怎样,谢谢! – Ose

4

他们是不同的类型,所以他们必须被区​​别对待。类型的大小不会影响重载或模板选择。

您的问题可能是int64_t在一个系统上是long而另一个系统上是long long。将typedef与重载或模板组合时,这是个问题。

相关问题