BOOST_STRONG_TYPEDEF上的numeric_limits错误

我以为BOOST_STRONG_TYPEDEF定义类型上的numeric_limits :: max()会得到与基础类型相同的结果。但是下面的程序表明情况并非如此(使用带有boost 1.65的g ++或clang ++编译):

#include <boost/serialization/strong_typedef.hpp>
#include <limits>
#include <iostream>

BOOST_STRONG_TYPEDEF(uint64_t,s);

int main(int,char **)
{
  std::cerr << std::numeric_limits<uint64_t>::max() << std::endl 
            << std::numeric_limits<s>::max() << std::endl;
  return 0;
}

结果:

$ clang++ test.cpp
$ ./a.out
18446744073709551615
0

这是预期的结果吗?

huayuan1005 回答:BOOST_STRONG_TYPEDEF上的numeric_limits错误

  

我以为BOOST_STRONG_TYPEDEF定义类型上的numeric_limits :: max()会得到与基础类型相同的结果。

没有理由假设。

您实际上是在问一种新的类型。这就是拥有 strong typedef的意思。这就是为什么您使用BOOST_STRONG_TYPEDEF而不是typedef的原因。

std::numeric_limits不会,不能也不应为您不知道的类型提供有意义的信息,例如您创建的新信息。

,

您的期望是错误的。从某种意义上讲,您看到的效果恰恰是强类型定义的结果。您的s不是int,而是单独的类型。 std::numeric_limits可能无法知道您的类型,因此,与其他任何自定义类型一样,您必须提供自己的专业化才能获得预期的输出。

,

这不是答案,而是扩展的评论。

我在想为什么std::numeric_limits<s>::max()不会编译以及为什么它返回(或更确切地说,打印)0。当我准备一个新问题时,我找到了答案here

这就是发生的情况。 std::numeric_limits<s>并非专门用于s [*],但是主模板std::numeric_limits<T>是由一些成员函数定义的,其中max()返回了某些默认值。特别是,max()返回默认构造的T{}。因此,std::numeric_limits<s>::max()返回s{}

BOOST_STRONG_TYPEDEF(uint64_t,s)定义了一个具有单个数据成员和用户定义的转换struct的{​​{1}}。此运算符的存在使像operator uint64_t()这样的代码起作用:std::cerr << std::numeric_limits<s>::max()转换为s{}

[*] uint64_t(0)

本文链接:https://www.f2er.com/3117128.html

大家都在问