C++ 为什么标准::数值限制<;秒>;::max()返回0?

C++ 为什么标准::数值限制<;秒>;::max()返回0?,c++,language-lawyer,C++,Language Lawyer,我发现了一个有趣的问题,std::numeric\u limits::max()返回0。答案是使用seconds::max()或std::numeric\u limits::max(),但我想知道为什么会发生这种情况。我希望它要么在编译时失败,要么正常工作。以下代码演示了gcc 4.9.3的问题 #include <iostream> #include <limits> #include <chrono> using namespace std; usin

我发现了一个有趣的问题,
std::numeric\u limits::max()
返回0。答案是使用
seconds::max()
std::numeric\u limits::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;
}
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
int main(int/*argc*/,const char*/*argv*/[])
{
const auto maxSeconds=std::numeric_limits::max();

std::cerr
std::numeric_limits
不是专门用于
std::chrono::seconds
的。为
std::numeric_limits
中的所有数据成员和函数提供了默认定义,以避免非特殊类型的编译器错误。
numeric_limits::max()的默认版本仅返回
T()
,在本例中为
0


通过检查
std::numeric_limits::is_specialized
,可以检查
std::numeric_limits::is_specialized
,默认为
false

std::chrono::seconds
本身不是标准的算术类型,因此
std::numeric_limits
不是专门化的所以你只看到一些毫无用处的默认值

要查询用于计数刻度的基础类型的范围(在gcc下,它是64位
长int
),请使用

std::numeric_limits::max();

相反。

我现在在limits标题中看到了它。但是为什么默认版本的numeric_limits::max()使用默认的构造函数。这里肯定会有一个编译器错误吗?@布鲁克亚当斯老实说,我不确定。我本想把它去掉,让用户使用sFiNeAE会更好,但是我可能丢失了一些东西。你和我都是。我会把这个问题留给一个语言律师,考虑一个图书馆缺陷报告I。f在足够的等待后没有出现。@Bruce-头文件的
可以追溯到SFINAE不像今天那么受欢迎的时候。如果没有
if constexpr
,两条路径都可以编译通常是一个优势。@Bo听起来似乎有道理。也许你可以演示一个案例,说明这是有用的?我发现它很有用rd到图片。可能的副本是一个副本。我错过了。但是,这个问题的最佳答案与目前为止的相同“因为标准上这么说”.我在寻找更多的见解。为什么标准会这么说?我也在寻找这样设计的原因,但不幸的是,没有效果。你的问题不再是重复的,我收回了我的投票。我认为这是对语言功能的又一次陈旧的未充分利用。(比如)也许你应该做的是用“std::numeric\u limit::is\u specialized::value?std::numeric\u limits::max():throw 0;”替换
std::numeric\u limits::max()
,顺便说一句,
std::numeric\u limits::max()默认情况下应该是
T::max()
如果这不存在,那么它应该是一个编译器错误。(不要让我们从
std::numeric\u limits::min()
开始,这对于浮点和整数类型来说是一个不一致的混乱。)
std::numeric_limits<seconds::rep>::max();