コンパイラー間で非型テンプレート パラメーターを使用した static_assert の動作に一貫性がない
C では、 static_assert を使用してコンパイル時に条件を検証できます。 。ただし、最近の観察により、異なるコンパイラ間で非型テンプレート パラメーターと組み合わせて使用した場合の static_assert の動作に差異があることが明らかになりました。
具体的には、次のコード スニペット:
template
struct Hitchhiker {
static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};
template
struct Hitchhiker {};
static_assert を使用して一般的なテンプレートのインスタンス化を無効にしようとすると、Clang と GCC では動作が異なります。 Clang は、テンプレートがインスタンス化されていない場合でもアサート エラーをトリガーしますが、GCC は 42 以外のパラメータ値でインスタンス化するときにのみエラーを発生させます。
この矛盾を理解するために、C 標準の関連セクションを調べてみましょう ( [temp.res]/8):
If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
このルールによれば、有効な特殊化を生成できないため、プライマリ テンプレート Hitchhiker は不正な形式になります。したがって、診断を発行する必要はありません。ただし、Clang は、要件がないにもかかわらず、診断を提供することを選択します。
インスタンス化を 42 のみに制限することが目的の場合、推奨されるアプローチは、次のように一般的なテンプレート定義を省略することです。
template
struct Hitchhiker {};
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3