分享
三行代码  ›  专栏  ›  技术社区  ›  ruipacheco

staid_clock::now()返回类型对gcc无效 - steady_clock::now() return type invalid with gcc

  •  1
  • ruipacheco  · 技术社区  · 1 周前

    我有以下代码:

    #include <chrono>
    
    struct SteadyTime : std::chrono::steady_clock::time_point {
        using time_point::time_point;
    
        static SteadyTime now() {
          return clock::now();
        }
    };
    

    这在visual studio 2019中很好,但在gcc 8.3中,我得到以下错误:

    <source>: In static member function 'static SteadyTime SteadyTime::now()':
    
    <source>:7:24: error: could not convert 'std::chrono::_V2::steady_clock::now()' from 'std::chrono::_V2::steady_clock::time_point' {aka 'std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >'} to 'SteadyTime'
    
           return clock::now();
    
                  ~~~~~~~~~~^~
    
    Compiler returned: 1
    

    这个代码似乎是标准的,所以有什么可能是错误的?

    1 回复  |  直到 1 周前
        1
  •  2
  •   Max Langhof    1 周前

    你要做的基本上是:

    struct Base
    {};
    
    Base getBase();
    
    struct Derived : Base
    {
        static Derived get() { return getBase(); }
    };
    

    https://godbolt.org/z/KZyP99

    这不起作用,因为编译器不知道如何转换 Base 给一个 Derived 是的。可以为添加构造函数 派生的 底座 来解决这个问题。

    不过,我会对总体设计提出质疑。继承自 std 设施通常是设计缺陷/弱点。喜欢组合胜过继承( 尤其地 如果你想要得到的东西不是多态的)。拥有 SteadyTime 暴露 time_point 成员(如果需要),或手动包装其接口。在同一继承层次结构中拥有和使用多个具体的(即非抽象的)类会很快导致对象切片和其他ub的混乱,以及用户的普遍困惑。