我有一段代码,其中 std::chrono::duration<int64_t, std::milli>
的子类,并用于创建一个包含在其中的 std::chrono::time_point
,就像这样。
#include <chrono>
class my_duration : public std::chrono::duration<int64_t, std::milli>
{ /* snip */ };
int main()
{
typedef std::chrono::time_point< std::chrono::system_clock, my_duration > my_time_point;
my_time_point t( my_duration{} );
//....
}
然而,当使用GCC 10时,在std::chrono::time_point中的静态断言会失败。
optwandboxgcc-headincludec++11.0.0chrono:764:37: error: static assertion failed: duration must be a specialization of std::chronono::duration
这可以在下面的链接中看到,它也证明了clang给出了同样的错误。https:/wandbox.orgpermlinkCQw6fWt4kZ1xYdet
在std::chrono中,失败的断言是由于 __is_duration
的结构。time_point
:
template<typename _Tp>
struct __is_duration
: std::false_type
{ };
template<typename _Rep, typename _Period>
struct __is_duration<duration<_Rep, _Period>>
: std::true_type
{ };
//... further down, in time_point:
static_assert(__is_duration<_Dur>::value,
"duration must be a specialization of std::chrono::duration");
我的理解是: __is_duration<my_duration>
将是 std::false_type
导致静态断言失败。
所以,我的问题是:这是否意味着不可能将std::chrono::duration子类与time_point一起使用派生类?还是有什么技巧可以让duration子类通过静态断言?
std::time_point
一直以来都要求duration类型是一个特殊化的 std::duration
. 如果没有,那么程序就是不正规的(也就是:编译错误)。这可能只是GCC第一次实现这个要求。
从 duration
并没有真正起到任何有用的作用。