为什么数字10用于引用整数类型0
Why is digits10 for reference to integer type 0?
以下代码:
#include <iostream>
#include <limits>
#include <cstdint>
int main()
{
std::cout << std::numeric_limits<std::uint64_t>::digits10 << "n"
<< std::numeric_limits<std::uint64_t&>::digits10 << "n";
}
输出
19
0
我希望std::uint64_t&
和std::uint64_t
的值相同:这种差异有原因吗?
18.3.2.1/2:
应为每种算术类型提供专门知识,包括浮点和整数,包括bool。该成员已特殊化(_S)对于numeric_limits的所有此类专门化都应为真。
所以我们知道,对于这些非引用类型,将存在专门化。然后18.3.2.3/1:
默认的numeric_limits模板应具有所有成员,但是具有0或false值。
我怀疑是这样做的,因为您总是可以在is_specialized
上static_assert来强制编译错误,但可能存在一些模板应用程序,其中0将是一个或多个限制的正常默认值。如果您希望能够测试引用,只需通过std::remove_reference
运行它。
我不确定将numeric_limits
专门用于您自己的类型是否合法。18.3.2.1/4中的标准规定:
非算术标准类型,如复数(26.4.2),不应拥有专业知识。
我个人认为,"该标准不会为非算术标准库类型提供专门化,但专门化用户类型是完全合法的"。你可以很容易地阅读这篇文章,就像完全禁止任何未提供的专业一样。
类型uint64&
是一个引用,因此它不是numeric_limits
模板应该用于的算术类型之一。
对于定义的算术类型以外的任何其他类型,使用默认定义,其中包含:
static const int digits10 = 0;
参考:http://www.cplusplus.com/reference/limits/numeric_limits/
std::numeric_limits
应专门用于基本算术数据类型(整数和浮点)。任何类型的引用都不属于它们,这就是为什么选择非专用模板,该模板的所有成员都是false
(0
)。
我希望std::uint64_t&具有与std::uint64_t:Is相同的值这种差异有什么原因?
虽然std::uint64_t
是算术类型,但std::uint64_t&
是复合类型,具有不同的含义。你有几个选择:
- 请始终通过删除引用、指针或两者来考虑基类型
static_assert( is_arithmetic<> )
- 检查
std::numeric_limits<T>::is_specialized
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 涉及旧式枚举和整数类型的重载解析
- 将字符串转换为整数类型T,检查是否存在溢出
- 整数文本太大,无法用任何整数类型表示--C++
- isdigit(c) - 字符或整数类型?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- C++模板专用化 - 将其他整数类型委托给uint64_t
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 根据浮点数选择最小整数类型
- 为什么 QVariant 将字符类型视为整数类型
- 我们可以在整数类型的双指针中分配2D整数数组的地址吗?怎么可能
- 默认情况下,决定整数类型是唱歌或无符号的类型
- 是否可以根据类型是整数类型还是浮点类型重载模板函数
- 使用固定整数类型的安全性
- 如何使用条件来检查类型名 T 是否是 C++ 中浮点类型的整数类型
- C++文本整数类型
- 哪种整数类型可以安全且便携式用于始终保持指针值
- 检测整数类型变量上的空白输入
- 为什么对Chrono :: Nanseconds的表示类型是签名的整数类型
- 如何处理警告:从较小的整数类型int转换为int*