以下聲明在聲明3.8.1中失敗,但似乎在其他測試編譯器(例如gcc 6.1,MSVC 2015,clang 3.9.1)中沒有錯誤地編譯。constexpr實例的初始化(例如`std :: integral_constant`)是否需要`= {}`?
constexpr std::integral_constant<int,0> myConstant;
鐺3.8.1給出:
error: default initialization of an object of const type 'const std::integral_constant<int, 0>' without a user-provided default constructor constexpr std::integral_constant<int,0> myConstant;
而下面的測試中所有的編譯器編譯正確:
constexpr std::integral_constant<int,0> myConstant = {};
這到底是怎麼回事? (是鏗鏘3.8.1錯誤是否正確?)
如果我定義我自己的類型,我應該寫一個用戶提供的默認ctor,以便用戶可以避免鍵入={}
?
'std :: integral_constant'沒有值表示(它是一個空的結構體)。你的「你應該總是明顯地初始化」規則是否仍然適用? –
@RossBencina:「* std :: integral_constant沒有值表示*」標準很清楚,所有'constexpr'變量都應該被初始化。它是否具有價值表現並不是標準關心的問題。在constexpr函數中聲明的任何變量也是如此。 –
這個答案目前沒有解決我的問題「這是怎麼回事?」 - 爲什麼不同編譯器之間的行爲不同?哪個編譯器是正確的? –