是否可以将cstdint类型定义绑定到某些特定于实现的类型std::numeric_limits没有专门针对的类型?

Can cstdint typedefs bind to some implementation specific types std::numeric_limits is not specialized for?

本文关键字:类型 numeric std limits 实现 定义 绑定 cstdint 于实现 是否      更新时间:2023-10-16

是否有可能,至少在理论上,cstdint typedefs绑定到一些std::numeric_limits没有专门用于的实现特定类型?

根据http://www.cplusplus.com/reference/limits/numeric_limits,让我引用一下,"[std::numeric_limits]是为每个基本算术类型特化的,其成员描述类型t的属性。这个模板不能为任何其他类型特化。"

根据http://en.cppreference.com/w/cpp/types/numeric_limits,让我再次引用,"实现可以为特定于实现的类型提供std::numeric_limits的专门化"。

"May", cppreference表示。所以他们不需要。

最后,根据http://www.cplusplus.com/reference/cstdint,在头文件"中定义的类型定义是基本整型或扩展整型的类型定义"。

所以,总而言之——cstdint typedefs似乎可以绑定到扩展整型(无论它们是什么),而不是基本整型(同样,无论它们是什么),因此可能与std::numeric_limits不兼容。这是正确的吗?

然而,我链接到的文件似乎在一点上有点不一致。cplusplus.com禁止std::numeric_limits不能为任何非基本算术类型专门化,这难道不是与cppreference允许std::numeric_limits可以为特定于实现的类型专门化相反吗?当然,除非这些特定于实现的类型实际上基本整型,在这种情况下,std::numeric_limits必须针对所有cstdint类型进行专门化。

这些文件把我弄糊涂了。所以我在这里问我的问题:)

编辑。

根据http://eel.is/c++draft/cstdint, cstdint必须绑定到整数类型。根据http://eel.is/c++draft/limits.numeric,"专门化应该为每个算术类型提供,包括浮点型和整型,包括bool"。整数类型算术类型,因此std::numeric_limits必须专门化用于cstdint typedefs,这种理解正确吗?

必须存在像std::numeric_limits<std::int_fast32_t>这样的专门化。

3.9.1/2:

有5种标准符号整数类型: " signed char ", " short int ", " int ", " long int ", " long long int ". ...也可以有实现定义的扩展的有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型

3.9.1/3:

对于每个标准有符号整数类型,都存在一个相应的(但不同的)标准无符号整数类型....同样,对于每个扩展的有符号整数类型,都存在一个相应的扩展的无符号整数类型....标准和扩展无符号整数类型统称为无符号整数类型

3.9.1/7:

类型boolcharchar16_tchar32_twchar_t以及有符号和无符号整数类型统称为整型类型。整型的同义词是整型

3.9.1/8:

整型浮点型统称为算术型。标准模板std::numeric_limits(18.3)的特化应该指定实现中每种算术类型的最大值和最小值。

18.3.2.1/2:

numeric_limits的专门化[应该为每种算术类型提供,包括浮点数和整数,包括bool

18.4.1:

namespace std {
  typedef signed_integer_type int8_t;    // optional
  //...
  typedef unsigned_integer_type uint8_t; // optional
  //...
}

所以<cstdint>中定义的类型可能是扩展类型,但肯定是整数类型,因此必须具有std::numeric_limits的相应专门化。

同样,所有的整型都是标准(3.9)中使用的意义上的"基本型",尽管并非所有的整型都是标准类型。