numeric_limits在BOOST_STRONG_TYPEDEF上是错误的
numeric_limits is wrong on a BOOST_STRONG_TYPEDEF
我假设BOOST_STRONG_TYPEDEF定义的类型上的numeric_limits::max()会给出与底层类型相同的结果。但下面的程序表明情况并非如此(使用 g++ 编译或使用 boost 1.65 编译的 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
是预期的结果吗?
我假设BOOST_STRONG_TYPEDEF定义的类型上的 numeric_limits::max() 会给出与底层类型相同的结果。
没有理由这么认为。
你真的要求一种新的类型。这就是拥有强大的typedef 的意义。这就是为什么你用BOOST_STRONG_TYPEDEF
而不是,嗯,typedef
.
std::numeric_limits
不会、不能、也不应该为它不知道的类型(例如您创建的新类型)提供有意义的信息。
你的期望是错误的。从某种意义上说,你看到的效果正是强 typedef 的目的。您的s
不是int
而是单独的类型。std::numeric_limits
不可能知道您的类型,因此与任何其他自定义类型一样,您必须提供自己的专业化才能获得预期的输出。
这不是答案,而是扩展评论。
我在想为什么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)
定义具有单个数据成员和用户定义的转换operator uint64_t()
的struct
。这个运算符的存在使这样的代码std::cerr << std::numeric_limits<s>::max()
工作:s{}
转换为uint64_t(0)
。
[*]static_assert(!std::numeric_limits<s>::is_specialized)
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- typedef名称与可变模板参数名称一致时出现GCC错误
- 模板中的Typedef导致阴影模板parm错误
- 类之间的 TypeDef 错误C++
- 错误:使用 tesseract 引擎时 C++ 中的声明'typedef struct tagBLOB BLOB'冲突
- cppcheck:使用 /typedef 的语法错误
- 如何修复 Typedef 变量未识别错误 C++ (Visual Studio 2017)
- 错误:使用不同类型的 Typedef 重定义
- 使用 Rcpp 和 typedef 时出现编译错误
- C typedef int arr [x] [y]在stackdump错误中失败
- 将指向前向声明类型的指针推送到 typedef'd 向量时出现编译器错误
- 来自 typedef 结构的错误
- 课堂上的Typedef.在另一个类错误中:尚未声明类型
- typedef映射作为返回类型到函数会引发编译器错误
- 将Typedef语句放入类链接链接列表中的C 错误
- C++模板化类中的 typedef 错误
- 即使typename关键字也会抛出Typedef错误
- Typedef错误:把Typedef放在哪里,应该怎么写
- C++中的Typedef错误
- 尝试与 typedef 交朋友时"elaborated type refers to typedef"错误