2

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

#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

这是预期的结果吗?

4

3 回答 3

2

我假设 BOOST_STRONG_TYPEDEF 定义的类型上的 numeric_limits::max() 会给出与基础类型相同的结果。

没有理由这样假设。

你确实要求一种新的类型。这就是拥有强大的typedef 的意义。这就是为什么您使用BOOST_STRONG_TYPEDEF而不是,嗯,typedef

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

于 2019-11-12T13:32:57.087 回答
1

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

于 2019-11-12T13:29:08.730 回答
0

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

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

所以这就是发生的事情。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使用单个数据成员和用户定义的转换定义a operator uint64_t()。这个操作符的存在使得代码像这样std::cerr << std::numeric_limits<s>::max()工作:s{}转换成uint64_t(0).

[*]static_assert(!std::numeric_limits<s>::is_specialized)

于 2019-11-12T14:58:20.453 回答