![](/img/trans.png)
[英]std::chrono::duration can be initialized by seconds, but not milliseconds?
[英]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.