为什么数字10用于引用整数类型0?

时间:2015-04-01 13:50:59

标签: c++

以下代码:

#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具有相同的价值:这种差异是否有原因?

3 个答案:

答案 0 :(得分:2)

18.3.2.1/2:

  

应为每种算术类型提供专业化   浮点和整数,包括bool。该成员是is_specialized   对于numeric_limits的所有这些特化,都应该是真的。

因此我们知道对于这些非引用类型将存在特化。然后是18.3.2.3/1:

  

默认的numeric_limits模板应包含所有成员,但是   0或假值。

我怀疑它是以这种方式完成的,因为你总是可以在is_specialized上使用static_assert来强制编译错误,但是可能会有一些模板应用程序,其中0对于一个或多个限制来说是一个ok的默认值。如果您希望能够测试引用,只需通过std::remove_reference运行它。

我不确定将numeric_limits专门用于您自己的类型是否合法。 18.3.2.1/4中的标准说:

  

非算术标准类型,如复数(26.4.2),不得   有专业。

我个人认为这句话“标准不会为非算术标准的libray类型提供专业化,但专门针对用户类型是完全合法的”。您可以很容易地将其视为完全禁止任何未提供的专业化。

答案 1 :(得分:1)

类型uint64&是一个引用,因此它不是numeric_limits模板应该用于的算术类型之一。

对于除定义的算术类型之外的任何其他类型,使用包含以下内容的默认定义:

static const int  digits10 = 0;

参考:http://www.cplusplus.com/reference/limits/numeric_limits/

答案 2 :(得分:0)

std::numeric_limits应该专门用于基本算术数据类型(整数和浮点)。任何类型的引用都不属于它们,这就是选择非专业模板的原因,它的所有成员都是false0)。

  

我希望std :: uint64_t&amp;与std :: uint64_t具有相同的值:是   有这种差异的原因吗?

虽然std::uint64_t是算术类型,但std::uint64_t&是复合类型并且具有不同的含义。您有几个选择:

  • 始终通过删除引用,指针或两者来考虑基本类型。
  • static_assert( is_arithmetic<> )
  • 检查std::numeric_limits<T>::is_specialized