2017-09-25 85 views
2

cppreference.comThe default constructor is defaulted。我也检查了C++14 draft,它在默认构造函数上什么都没说,除了声明:constexpr duration() = default;如何构建std :: chrono :: duration默认值?

当我运行下面的代码时,我很惊讶。

chrono::seconds s; 
cout << s.count() << endl; 

我每次运行它,那么程序将打印一些任意的数字:140737364037104140737078676496等。

看来s没有很好的初始化。然后我检查了编译器(GCC 4.8)的std::chrono::duration的实现。这个类有一个int类型的数据成员(即count),没有任何类内初始化器。而构造函数是默认构造的。所以数据成员实际上是未初始化的。这就是为什么程序总是打印一些任意数字。

以下是我的问题:

  1. 这是妥当的行为吗?或者编译器应该给数据成员一个类内初始化器?
  2. 如果这是正确的行为,为什么标准NOT不指定0的默认值std::chrono::duration
+3

什么问题?这与'int a;'没有区别。如果你理解了在这种情况下的默认初始化,那么你就明白了“持续时间”的情况。 –

回答

1

由于优化,默认的构造持续时间不是零初始化的。

ISO C++ Discussion从同一个问题引用维森特J. Botet Escriba

您好,我猜是跟随模式不为了什么,你不使用, 但霍华德将支付更好地解释它。

如果你想表示被默认初始化为零,你 可以只提供一个做

std::chrono::duration<MyInt> d; // MyInt default constructor initialize the value to zero.

经确认,并进一步由首席设计师和<chrono>时间笔者解释公用事业(霍华德Hinnant

+2

这是零初始化的另一种语法:'chrono :: seconds s {};' –

+0

有道理。谢谢! –