是否有可能,至少在理论上,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:
类型
bool
、char
、char16_t
、char32_t
、wchar_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)中使用的意义上的"基本型",尽管并非所有的整型都是标准类型。