为什么 std::numeric_limits<seconds>::max() 返回 0?
Why does std::numeric_limits<seconds>::max() return 0?
我发现了一个有趣的问题,std::numeric_limits<seconds>::max()
返回 0。答案是改用seconds::max()
或std::numeric_limits<seconds::rep>::max()
,但我有兴趣知道为什么会发生这种情况。我希望它要么在编译时失败,要么只是工作。以下代码演示了 gcc 4.9.3 的问题。
#include <iostream>
#include <limits>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main(int /*argc*/, const char* /*argv*/[])
{
const auto maxSeconds = std::numeric_limits<seconds>::max();
std::cerr << maxSeconds.count() << "n";
const auto maxSeconds2 = seconds::max();
std::cerr << maxSeconds2.count() << "n";
return 0;
}
我在 chrono 头文件中看不到任何隐式转换。如果duration
隐式转换为数字类型,并且符号丢失或bool
则最终可能会得到最小值为零 - 但最大值为零没有意义。
正如 TartanLlama 指出的那样,默认专用化使用默认构造函数,因此返回 0。
深入研究该标准的旧副本,我看到以下规定:
18.3.2.3 类模板
numeric_limits
[数字限制]非算术标准类型,如
complex<T>
(26.4.2),不得具有专业。
过了一会儿:
默认
符合numeric_limits<T>
模板应具有所有成员,但值为 0 或 false。CV 资格的
cv T
型numeric_limits
的每个成员的价值应等于 不合格类型的专业对应成员T
.
缺少的是解释为什么委员会认为这是比编译失败更好的主意。是否需要提供磁带库缺陷报告?
更新:我已将此作为ISO委员会的问题提出
https://issues.isocpp.org/show_bug.cgi?id=186
std::numeric_limits
不是专门用于std::chrono::seconds
的。std::numeric_limits
为所有数据成员和函数提供默认定义,以避免非专用类型的编译器错误。numeric_limits<T>::max()
的默认版本只返回 T()
,在这种情况下0
。
您可以在编译时检查std::numeric_limits
是否专用于给定T
,方法是选中默认为 false
的 std::numeric_limits<T>::is_specialized
。
std::chrono::seconds
本身不是标准的算术类型,因此std::numeric_limits
不是专门用于它的。所以你只看到一些相当无用的默认值。
要查询用于计算即时报价的基础类型的范围(在 gcc 下为 64 位long int
),请使用
std::numeric_limits<seconds::rep>::max();
相反。
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- c++curl返回413请求实体过大,但是post大小远小于max大小
- 如果std::max()通过引用返回(这是必须的),这是否会导致悬空引用
- 如何计算并返回指向max元素的指针的值?C++
- 为什么 std::max 通过 const 返回?
- 为什么 std::numeric_limits<seconds>::max() 返回 0?
- 当min和max为正数时,Rand()返回负数
- 从Find Max方法返回一个int值并将其打印在测试文件中
- 返回键值在MIN和MAX之间的子映射