std::chrono::duration 默认值是如何构造的?

for*_*ack 5 c++ c++11 c++-chrono

cppreference.comThe default constructor is defaulted。我还检查了C++14 draft,除了声明之外,它在默认构造函数上什么也没说:constexpr duration() = default;

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

chrono::seconds s;
cout << s.count() << endl;
Run Code Online (Sandbox Code Playgroud)

每次运行它时,程序都会打印一些任意数字:140737364037104140737078676496等等。

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

以下是我的问题:

  1. 这是正确的行为吗?或者编译器应该为数据成员提供一个类内初始值设定项?
  2. 如果这是正确的行为,为什么标准不指定默认值,例如0, for std::chrono::duration

Out*_*ned 7

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

引用Vicente J. Botet EscribaISO C++ 讨论中同一问题中的内容:

嗨,我想遵循的模式是不为不使用的东西付费,但霍华德会更好地解释这一点。

如果您希望表示形式默认初始化为零,您可以只提供一个来实现这一点

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

<chrono>首席设计师和时间实用程序的作者(Howard Hinnant)证实并进一步解释了这一点

  • 这是零初始化的另一种语法:`chrono::seconds s{};` (4认同)