繁体   English   中英

是 std::chrono::duration 默认初始化为 0

[英]is std::chrono::duration default initialized to 0

下面的 d 值是已初始化(大概为 0)还是未初始化(读取不安全)?

std::chrono::system_clock::duration d;

文档说默认构造函数是默认的。

下面的 std 库代码似乎表明它是未初始化的,因为最终 int64_t 是一个标量,而标量的默认初始化是没有初始化。

我的理解正确吗? std::chrono::system_clock::time_point被初始化为 0 时,它让我吃惊。

    struct system_clock
    {
      typedef chrono::nanoseconds                   duration;
...
    /// nanoseconds
    typedef duration<int64_t, nano>         nanoseconds;

...
    template<typename _Rep, typename _Period>
      struct duration
      {
    typedef _Rep                        rep;
    typedef _Period                     period;

...

http://eel.is/c++draft/time.duration#2

Rep应为算术类型或模拟算术类型的类。

http://eel.is/c++draft/time.duration#1

constexpr duration() = default;

这些一起说duration默认初始化的,因为Rep默认初始化的

http://eel.is/c++draft/dcl.init#7

默认初始化T类型的对象意味着:

  • 如果T是(可能是 cv 限定的)类类型 ([class]),则考虑构造函数。 枚举适用的构造函数([over.match.ctor]),并通过重载决议([over.match])选择初始化器()的最佳构造函数。 如此选择的构造函数被调用,参数列表为空,以初始化对象。 (7.2)

  • 如果T是数组类型,则每个元素都是默认初始化的。

  • 否则,不执行初始化。

因此:

seconds s;  // no initialization.

然而,这:

seconds s{};  // zero-initialize

进行值初始化,对于标量是零初始化

http://eel.is/c++draft/dcl.init#list-3.11

否则,如果初始化列表没有元素,则对象是值初始化的。

http://eel.is/c++draft/dcl.init#8

对 T 类型的对象进行值初始化意味着:

  • 如果 T 是(可能是 cv 限定的)类类型 ([class]),则 ...
  • 否则,对象是零初始化的。

http://eel.is/c++draft/dcl.init#6

对 T 类型的对象或引用进行零初始化意味着:

  • 如果 T 是标量类型,则对象被初始化为通过将整数文字 0(零)转换为 T 获得的值;90

因此, duration客户端可以选择未初始化或零初始化,标准提供的duration s 保证具有带符号的整数Rep 如果您使用自定义时间带班型Rep ,那么这将是默认初始化通过无论定义Rep如下。

标准中没有规定duration的实现,只有它必须提供的接口。 默认构造函数没有明确声明内部状态将具有任何特定值,因此您不能假设默认构造的持续时间将被初始化为零。 特定的实现可能会这样做,并且对于用于_Rep某些类型可能为零初始化,但对于其他类型则_Rep

time_point文档明确给出了默认构造的 time_point 的状态,这就是该对象初始化为零的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM