次の宣言は、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 = {};
?
自分のタイプを定義した場合、ユーザーが入力できるようにユーザ提供のデフォルトのctorを書く必要がありますか?={}
?
'std :: integral_constant'には値の表現がありません(空の構造体です)。あなたの "あなたは常に目に見える形で初期化すべきです"というルールがまだ適用されていますか? –
@RossBencina: "* std :: integral_constantには値の表現がありません*"標準では、すべての 'constexpr'変数は初期化されるはずです。それが価値表現を持っているかどうかは、標準が気にするものではありません。これは 'constexpr'関数で宣言された変数にも当てはまります。 –
この回答は現在、私の質問に「ここでは何が起こっていますか? - 異なるコンパイラ間で動作が異なるのはなぜですか?コンパイラは正しいですか? –