"std::is_same_v<size_t,uint64_t>"在两种类型长度均为 8 个字节时计算结果为"false"



代码:

#include <iostream>
#include <type_traits>
int main() {
std::cout << "sizeof(size_t): " << sizeof(size_t) << std::endl;
std::cout << "sizeof(uint64_t): " << sizeof(uint64_t) << std::endl;
if constexpr (std::is_same_v<size_t, uint64_t>) {
std::cout << "size_t == uint64_t" << std::endl;
} else {
std::cout << "size_t != uint64_t" << std::endl;
}
}

结果:

sizeof(size_t): 8
sizeof(uint64_t): 8
size_t != uint64_t

编译器信息:

Apple clang version 14.0.0 (clang-1400.0.29.102)
Target: arm64-apple-darwin21.6.0
Thread model: posix

size_t不等于uint64_t有什么原因吗?如果是,标准中是否特别提到了为什么会这样?

通常类型size_t是类型unsigned long的别名。

来自C标准(7.19通用定义<stddef.h>(

4用于size_t和ptrdiff_t的类型不应具有整数转换秩大于有符号长整型的转换秩,除非实现支持足够大的对象,使之成为必要。

注意类型unsigned long int的秩等于类型signed long int的秩。

另一方面,类型uint64_t通常被定义为类型unsigned long long int的别名。尽管这是实现定义的。

对于您的代码,显示的输出意味着sizeof( unsigned long int )在所用系统上也等于8。

  1. 类型size_­t是一种实现定义的无符号整数类型,其大小足以包含任何对象([expr.sizeof](的字节大小
  2. 推荐做法:除非需要更大的大小来包含所有可能的值,否则实现应该为ptrdif_t和size_t选择整数转换秩([conv.rank](不大于有符号长整型的类型

[support.types]

相关内容

最新更新