我有一段代码,其中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时,这似乎很好地编译和工作。但是,当使用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结构造成的。
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不可能使用派生类?或者是否有什么技巧可以让持续性子类传递静态断言?
发布于 2020-05-27 14:48:08
std::time_point一直要求工期类型是std::duration的专门化。如果不是,那么程序就是格式错误(又名:编译错误)。这可能是GCC第一次实施这一要求。
从duration派生出来并没有任何有用的用途。
https://stackoverflow.com/questions/62045915
复制相似问题