問題タブ [parameter-pack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - O0 で関数パラメーター パックとして渡された場合、静的 constexpr への未定義の参照 (より高い最適化レベルで動作)
次のコード スニペットは、最適化レベルが O0 よりも高い場合にのみリンクできます。
ここで実行できます: http://cpp.sh/3d7p
O0 を使用して C++11/14 を構成すると、次のリンカー エラーで失敗します。
O1、O2、または O3 を選択すると、正常にリンクされ、プログラムの実行によって期待される出力が返されます。
解決
この問題は可変個引数テンプレート関数とは関係がないことが示されました。唯一の問題は、コンパイラの最適化がstatic constexpr
コンパイル時 (>O0) またはリンク時 (O0) にメンバーを置換したかどうかです。後者の場合、 の宣言にX::a
も有効な定義が必要です。constexpr int X::a;
これは、上記のコード スニペットに追加することで実行できます。結果のコード スニペットは、任意の最適化レベルにリンクします。
static constexpr
メンバーでは、定義中ではなく、宣言中に初期化して完全な型にする必要があることに注意してください。
コンパイラがコンパイル時にすでに置換できるようにするには、O0 も含めて、への参照をX::a
渡さないようにする必要があります。そのため、このスニペットは、O0 の定義がなくても O0 と正常にリンクされますX::a
。
c++ - 長さの異なるメンバーごとのパラメーター パックを比較する
ここでは、2 つのパラメーター パック間の互換性チェックを定義します。実際のメンバー チェックは、等価チェックよりも複雑なので、フォールバックできませんis_same<integer_sequence<int, TVals...>, integer_sequence<int, UVals...>>
。各メンバーを個別にチェックする必要があります。
are_compatibles<type<1, 2>, type<1, 2>>::value == true;
コンパイルします。are_compatibles<type<1, 2>, type<2, 1>>::value == false
コンパイルします。are_compatibles<type<1, 2>, type<1>>::value == false
パラメーター パックの長さが同じでないため、コンパイルに失敗します。
長さの異なるメンバーごとのパラメーター パックを比較する方法はありますか?