g ++ std :: chrono断言中断

问题描述 投票:0回答:3

我在使用C ++项目中的一些代码时遇到了麻烦。它包括std::chrono库并继续打破以下断言:

static_assert(system_clock::duration::min() < system_clock::duration::zero(), "a clock's minimum duration cannot be less than its epoch");

断言打破了使用g ++ 6.3.0的Debian机器和带有Windows 10,CygWin和g ++ 7.3.0的PC的代码。我还在一个在线C ++编译器中尝试了一个简单的例子,包括chrono库,它本身并没有给出任何问题,但是当手动比较计时系统时钟的最小和零持续时间给出了应该触发断言的结果好。

我搜索了这个问题并发现了一些线索,导致TZ posix变量引起的一些相关问题,这些变量保存了时区信息。尝试取消设置并将其设置为正确的值,但它对断言没有影响。

我很感激任何指针或建议。

编辑:当std :: chrono :: milliseconds :: zero()的值(如预期)为0时,std :: chrono :: milliseconds :: min()的值为-9223372036854775808,或-2 ^ 63我认为长期值的最小可能值(可能溢出?)。

c++ std assert chrono
3个回答
1
投票

经过一些测试后,我意识到只有在使用g ++通过所使用的测试软件时才会在两个系统中触发断言,因为在其外部编译的相同代码并没有使用相同编译器的断言失败。

事实证明,该软件使用EDG解析器,它需要选项--64_bit_target来避免触发断言。不幸的是,解析器文档中没有关于该选项的信息,所以我不知道没有它就会发生这个问题的原因。

可能这个问题现在没什么价值,但我不想删除它,因为人们已经写了一些可能对某些人感兴趣的答案。


0
投票

持续时间可能是负数,正如您在... :: min()的高负值中找到的那样。断言是不正确的,几乎就像断言-1必须大于零。

C ++ 17规范声明了一个用于查找绝对持续时间的abs()函数,并讨论了它对有符号和无符号表示的适用性:

23.17.5.9持续时间算法[time.duration.alg]

template <class Rep, class Period> constexpr duration<Rep, Period> abs(duration<Rep, Period> d);

1备注:除非numeric_limits <Rep> :: is_signed为true,否则此函数不应参与重载决策。

2返回:如果d> = d.zero(),则返回d,否则返回-d。


0
投票

我可能有两个建议:

  1. 一般来说,断言失败只发生在Debug版本中,所以如果你只想成功构建,你可以构建发布版本来避免这个问题。
  2. 您可以在适当的区域中确认您的Debian和Windows时区。
© www.soinside.com 2019 - 2024. All rights reserved.