首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类std::chrono::工期

子类std::chrono::工期
EN

Stack Overflow用户
提问于 2020-05-27 14:44:24
回答 1查看 317关注 0票数 1

我有一段代码,其中std::chrono::duration<int64_t, std::milli>被子类化,用于创建一个std::chrono::time_point,如下所示:

代码语言:javascript
复制
#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时,这似乎很好地编译和工作。但是,当使用GCC 10时,std::chrono::time_point中的静态断言将失败:

/opt/wandbox/gcc-head/include/c++/11.0.0/chrono:764:37:错误:静态断言失败:工期必须是std::

::的专门化

在下面的链接中可以看到这一点,这也说明了clang提供了相同的错误:https://wandbox.org/permlink/CQw6fWt4kZ1xYdet

在std::chrono中,失败的断言是由于time_point使用的time_point结构造成的。

代码语言:javascript
复制
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::time_point不可能使用派生类?或者是否有什么技巧可以让持续性子类传递静态断言?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-27 14:48:08

std::time_point一直要求工期类型是std::duration的专门化。如果不是,那么程序就是格式错误(又名:编译错误)。这可能是GCC第一次实施这一要求。

duration派生出来并没有任何有用的用途。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62045915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档