gpt4 book ai didi

c++ - 为什么 `std::chrono::weekday` 允许但不保留有效范围之外的值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:15 29 4
gpt4 key购买 nike

根据 [time.cal.wd.overview]/1 部分C++ 标准:

weekday represents a day of the week in the civil calendar. It normally holds values in the range 0 to 6, corresponding to Sunday through Saturday, but it may hold non-negative values outside this range.

同时算术运算执行模 7 算术,强制结果在 [0, 6] 范围内,例如

weekday wd(7);
// wd.ok() == false - wd is invalid
++wd; // wd == weekday(1)
// wd.ok() == true - wd silently becomes valid

为什么 weekday 有这种奇怪的行为,特别是为什么允许 [0, 6] 之外的值但不被算术运算保留?

最佳答案

weekday(unsigned wd) 构造函数 promise 保存 [0, 255] 范围内的任何值。这样做的理由是:

  1. 速度非常快。
  2. 它允许客户端将“未使用”值分配给在客户端逻辑中有用的内容。

以(2)为例:

constexpr weekday not_a_weekday{255};
...
weekday wd = not_a_weekday;
in >> wd;
if (wd == not_a_weekday)
throw "oops";

weekday 算术强制范围回到 [0, 6],因为如果您编写算法来执行模 7 算术,根本没有范围检查,这就是自然发生的情况。 IE。这是最快的事情。


总而言之:性能是当前 weekday 规范的基本原理,结合尽可能小的 sizeof(这也有助于提高性能)。

然而,尽可能多地提供性能,无论留下什么行为(自然发生)都可以有利于标准化并让客户利用这些行为,而不是说它们是未定义的行为TM .

事实上,规范尽可能地避免了 UB,而是选择了未指定的行为。例如 weekday{300} 可能不会存储您想要的值,但它不能重新格式化您的磁盘,并且不允许优化器假装代码不存在.

关于c++ - 为什么 `std::chrono::weekday` 允许但不保留有效范围之外的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54041671/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com