[英]C++ `digits10` is 6 for IEEE float, but the first non-representable integer already has 8 digits?
[英]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。 对于numeric_limits的所有此类特化,成员is_specialized应为true。
因此,我们知道对于这些非引用类型将存在特化。 那么18.3.2.3/1:
默认的numeric_limits模板应包含所有成员,但具有0或false值。
我怀疑它是以这种方式完成的,因为你总是可以在is_specialized
上使用static_assert来强制编译错误,但是可能会有一些模板应用程序,其中0对于一个或多个限制来说是一个ok的默认值。 如果您希望能够测试引用,只需通过std::remove_reference
运行它。
我不确定将numeric_limits
专门用于你自己的类型是否合法。 18.3.2.1/4中的标准说:
非算术标准类型,例如complex(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具有相同的值:这是否存在这种差异的原因?
虽然std::uint64_t
是算术类型,但std::uint64_t&
是一种复合类型,具有不同的含义。 你有几个选择:
static_assert( is_arithmetic<> )
std::numeric_limits<T>::is_specialized
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.