C 標準に準拠しているにもかかわらず、プライマリ テンプレートを使用できる任意のスコープでの明示的な特殊化が明示的に許可されています。定義されている場合、提供されたコードでは GCC ではコンパイル エラーが発生しますが、Clang では発生しません。この矛盾により、これが GCC のバグであるかどうか、またそのバグ トラッカーでバグを特定する方法について疑問が生じます。
[temp.expl.spec] の段落 2 によると、「明示的な特殊化は、対応するプライマリ テンプレートを定義できる任意のスコープ。ただし、-std=c 2a を指定した GCC HEAD 8.0.1 では、名前空間以外のスコープでは明示的な特殊化が許可されていないことを示すエラー メッセージが生成されます。
標準からのこの逸脱は、GCC の潜在的なバグを示唆しています。バグ トラッカーでこの問題を見つけるには、GCC バグ データベースで「明示的な特殊化」または「スコープ」を検索します。あるいは、バグ報告システムを使用して問題を直接報告することもできます。
この場合、問題は Bug 85282 として報告されており、問題と CWG 727 修正との矛盾が認められています。この修正により、プライマリ テンプレートを定義できる任意のスコープで明示的な特殊化を許可するように標準が改訂されました。
このバグの意味するところは、GCC ユーザーが名前空間のスコープ外で明示的な特殊化を宣言しようとすると、コンパイルの問題が発生する可能性があるということです。 C 標準ではそのような宣言が許可されているにもかかわらず。この問題を軽減するために、ユーザーは非 GCC コンパイラーをターゲットにするか、名前空間内で明示的な特殊化をカプセル化することができます。名前空間は現在、GCC の標準解釈と互換性のある唯一のスコープです。
以上がGCC が非名前空間スコープで明示的な特殊化のコンパイルに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。