为什么 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()
我正在查看一些使用 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()