2017-09-25 49 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

有道理。謝謝! –

相關問題