C++ std::chrono::duration默认值是否初始化为0
d值是否已初始化(假定为0)或未初始化(读取不安全) 表示默认构造函数是默认的 下面的std库代码似乎表明它未初始化,因为最终int64_t是一个标量,标量的默认初始化是不初始化 我的理解正确吗?当C++ std::chrono::duration默认值是否初始化为0,c++,c++11,chrono,C++,C++11,Chrono,d值是否已初始化(假定为0)或未初始化(读取不安全) 表示默认构造函数是默认的 下面的std库代码似乎表明它未初始化,因为最终int64_t是一个标量,标量的默认初始化是不初始化 我的理解正确吗?当std::chrono::system\u clock::time\u point被初始化为0时,我非常惊讶 struct system_clock { typedef chrono::nanoseconds duration; ...
std::chrono::system\u clock::time\u 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;
...
struct系统时钟
{
typedef chrono::纳秒持续时间;
...
///纳秒
typedef持续时间纳秒;
...
模板
结构持续时间
{
typedef_Rep;
类型定义周期;
...
标准中未规定持续时间的实现,仅规定了它必须提供的接口。默认构造函数未明确说明内部状态将具有任何特定值,因此您不能假定默认构造的持续时间将初始化为零。特定实现可能会被忽略o因此,对于用于\u Rep
的某些类型,它可能是零初始化的,但对于其他类型,它可能不是零初始化的
fortime\u点
明确给出了默认构造时间点的状态,这就是该对象初始化为零的原因。
Rep
应为算术类型或模拟算术类型的类
constepr duration()=默认值;
它们一起表示,duration
默认初始化为Rep
默认初始化
默认情况下,初始化类型为T
的对象意味着:
- 如果
T
是(可能符合cv条件的)类类型([class]),则会考虑构造函数。适用的构造函数包括
枚举([over.match.ctor]),并且是初始值设定项的最佳值
()是通过重载解析([over.match])选择的
使用空参数列表调用这样选择的构造函数
初始化对象。(7.2)
- 如果
T
是数组类型,则默认初始化每个元素
- 否则,不执行初始化
因此:
然而,这:
seconds s{}; // zero-initialize
执行值初始化,对于标量,这是零初始化
否则,如果初始值设定项列表没有元素,则对象值已初始化
初始化T类型对象的值意味着:
- 如果T是(可能是cv限定的)类类型([class]),那么
- 否则,对象初始化为零
将类型为T的对象或引用初始化为零意味着:
- 如果T是标量类型,则将对象初始化为通过将整数文本0(零)转换为T;90而获得的值
因此,duration
客户端可以选择未初始化或零初始化,std提供的duration
s保证有一个带符号的整数Rep
。如果您使用类类型为Rep
的自定义duration,那么它将默认由Rep的任何定义初始化代码>如下。但是std::chrono::seconds是一种类类型。您省略了第一个项目符号的内容,这似乎与以下内容相关:(我研究过,chrono::seconds的零值初始化似乎需要“秒”的零初始化。但这是否意味着Rep对象的零初始化?为了实现这一点,Rep对象需要是非静态数据成员。这是明确指定的吗?库规范说“实现可以使用任何提供等效可观察行为的技术。”仅用于“说明”"成员。所以这似乎不能保证?您引用的话证明了我的论点。如果实现具有除exposition only数据成员指定的行为之外的可观察行为,则它不符合要求。供应商必须支持显式默认默认构造函数的可观察行为,并使用Rep
data member、 供应商可能会改变实现,例如,将数据成员名称拼写为除rep\uuu
以外的其他名称。谢谢,我误解了“等效可观察行为”的含义。我认为它意味着所有非“仅公开”的行为规则。现在我很清楚了。最后,chrono::seconds的行为就像一个基本的算术类型,非常有用。嗯,这意味着我们不应该按值传递std::chrono::duration
s?如果你也遵循不按值传递int
的原则。
seconds s; // no initialization.
seconds s{}; // zero-initialize