Bru*_*ams 18 c++ language-lawyer
我找到了一个有趣的问题,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;
}
Run Code Online (Sandbox Code Playgroud)
我在chrono头文件中看不到任何隐式转换.如果a duration已隐式转换为数字类型并且符号丢失或者bool您最终可能最小为零 - 但最大值为零则没有意义.
正如TartanLlama指出的那样,默认特化使用默认构造函数,因此返回0.
深入研究标准的旧副本,我看到以下dictats:
18.3.2.3类模板
numeric_limits[numeric.limits]非算术标准类型,如
complex<T>(26.4.2),不应具有专业化.
过了一会儿:
默认
numeric_limits<T>模板应包含所有成员,但具有0或false值.
numeric_limitscv限定类型的特化的每个成员的值cv T应等于非限定类型的特化成员的相应成员的值T.
缺少的是解释为什么委员会认为这比编译失败更好.图书馆缺陷报告是否合理?
更新:我已将此作为ISO委员会的一个问题提出
Tar*_*ama 10
std::numeric_limits不是专门的std::chrono::seconds.为所有数据成员和函数提供了默认定义,std::numeric_limits以避免非特定类型的编译器错误.默认版本numeric_limits<T>::max()只是简单地返回T(),这是0在这种情况下.
您可以通过检查来检查编译时std::numeric_limits是否专用于给定,默认为.Tstd::numeric_limits<T>::is_specializedfalse
std::chrono::seconds它本身不是标准的算术类型,因此std::numeric_limits不专门用于它.所以你只看到一些相当无用的默认值.
要查询用于计算刻度的基础类型的范围(在gcc下,是64位long int),请使用
std::numeric_limits<seconds::rep>::max();
Run Code Online (Sandbox Code Playgroud)
代替.
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |