2015-04-01 80 views
5

下面的代码:为什么数字10参考整数类型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"; 
} 

输出

我希望std::uint64_t&有相同的值std::uint64_t:是否有这种差异的一个原因?

+2

'的std :: numeric_limits'不擅长该类型,所以它默认为0。 – 0x499602D2 2015-04-01 13:59:09

+1

从语言设计的角度来看,不应该默认为编译错误吗? – 2015-04-01 14:00:59

+2

没有具体的原因 - 它只是使参考类型在'numeric_limits'中具有相同的值,因为非参考需要额外的努力,并且没有人认为它会使您方便。如果你关心你,你可以'std :: remove_reference :: type'。 – milleniumbug 2015-04-01 14:04:30

回答

2

18.3.2.1/2:

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

所以我们知道对于这些非参考类型将存在专门化。然后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),不应该 有专业化。

我个人认为这个标准是“该标准不会为非算术标准库类型提供专门化,但是专门针对用户类型是完全合法的”。你可以简单地阅读它,完全禁止任何未提供的专业化。

+0

似乎是一个蹩脚的错误,但现在这是最好的A,如果有人没有拿出一个答案来解释我会接受的推理。 :) – NoSenseEtAl 2015-04-01 14:58:20

+0

为非算术'T'专门设置'std :: numeric_limits' [不允许](https://stackoverflow.com/questions/8513417/what-c​​an-and-cant-i-specialize-in-在-STD-命名空间)。 – edmz 2015-04-01 15:02:22

+0

@MarkB我指的是:“numeric_limits不应该专门用于非算术标准类型”。你不能专注于'std'命名空间,以我的理解(其他人应该允许btw)。还是你的意思是别的? – edmz 2015-04-01 15:13:24

0

std::numeric_limits预计专门用于基本的算术数据类型(整数和浮点数)。任何类型的参考都不属于他们,这就是为什么选择非专业模板,其所有成员都是false0)。

我期望的std :: uint64_t中&有相同的值的std :: uint64_t中:是 有这种差异的一个原因?

虽然std::uint64_t是算术式,std::uint64_t&是这样的化合物类型,并且具有不同的含义。您有几个选项:

  • 请始终考虑基本类型,方法是删除引用,指针或两者。
  • static_assert(is_arithmetic<>)
  • 检查std::numeric_limits<T>::is_specialized
相关问题