为什么 C++ 引入 duration_cast 而不是使用 static_cast?

Why did C++ introduce duration_cast instead of using static_cast?

我正在查看一些使用 duration_cast 的代码。看着它,我想知道为什么 static_cast 没有被使用,因为 static_cast 的生活目的是在类型之间进行转换。

为什么 C++ 需要一个新的运算符来转换时间?为什么 static_cast 没有被使用?


也许我不理解 C++ 在毫秒、微秒、纳秒等之间产生的差异。出于某种原因,我认为答案很明显或在 Stack Overflow 上进行了讨论,但我还没有找到它。

在不存在精度损失风险的情况下,已经存在时间间隔的直接转换。 duration_cast 存在精度损失风险时需要。

因此,

duration_cast 与其说是一个运算符,不如说是一种有意的转换。

static_cast 不适合,因为不同的持续时间类型不相关。它们完全不同 类,恰好支持相同的概念。

例如:

#include <chrono>

int main()
{
  using namespace std::literals;

  // milliseconds    
  auto a = 10ms;

  // this requires a duration-cast
  auto lossy = std::chrono::duration_cast<std::chrono::seconds>(a);

  // but this does not
  auto not_lossy = std::chrono::nanoseconds(a);
}

多年来我多次重温这个问题,现在我认为这可能是我的设计错误。

我目前正在尝试更多地依赖于不应隐式进行的转换的显式转换语法,而不是 "named conversion syntax"。

例如:

https://howardhinnant.github.io/date/date.html#year

year y = 2017_y;
int iy = int{y};  // instead of iy = y.to_int()