Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::chrono::duration默认值是否初始化为0_C++_C++11_Chrono - Fatal编程技术网

C++ std::chrono::duration默认值是否初始化为0

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; ...

d值是否已初始化(假定为0)或未初始化(读取不安全)

表示默认构造函数是默认的

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

我的理解正确吗?当
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
的某些类型,它可能是零初始化的,但对于其他类型,它可能不是零初始化的

for
time\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