gpt4 book ai didi

c++ - 64 位 G++ 4.6.3 不会将 longs 视为专用函数模板中的 long longs,即使它们的大小相同。这是一个错误吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:19:31 24 4
gpt4 key购买 nike

考虑以下代码:

#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 位 G++ 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大小相同,或者这是我应该报告的错误?

最佳答案

int64_t 的底层类型可以是任何符合要求的东西。做好就好了long在一个平台上 long long在另一个上。

由于您为 long long 提供了特化如果int64_t,通用版本没有主体不是 long long你得到一个 undefined reference 。

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

关于c++ - 64 位 G++ 4.6.3 不会将 longs 视为专用函数模板中的 long longs,即使它们的大小相同。这是一个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12463402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com