ホームページ > バックエンド開発 > C++ > GCC が名前空間外での明示的な特殊化を拒否するのはなぜですか?

GCC が名前空間外での明示的な特殊化を拒否するのはなぜですか?

DDD
リリース: 2024-11-18 22:57:02
オリジナル
220 人が閲覧しました

Why Does GCC Reject Explicit Specialization Outside of a Namespace?

非名前空間スコープでの明示的な特殊化に関する GCC の標準との不一致

C 標準では、明示的なテンプレートの特殊化を任意のスコープで宣言することが明示的に許可されていますここで、対応するプライマリ テンプレートを定義できます。ただし、GCC の動作はこの標準から逸脱しています。この矛盾は、名前空間の外で宣言された明示的な特殊化がコンパイルに失敗する、GCC の最近のバージョンで観察されています。

この問題を説明するには、次のコードを考えてみましょう。

template<typename T>
struct Widget
{
    template<typename U>
    void foo(U)
    {
    }

    template<>
    void foo(int*)
    {
    }
};
ログイン後にコピー

これは、コードは Clang で正常にコンパイルされますが、GCC でエラーが発生します:

error: explicit specialization in non-namespace scope 'struct Widget<T>'
ログイン後にコピー

このエラーは、非名前空間スコープでの明示的な特殊化を明示的に許可する C 標準と矛盾します。 C 標準の [temp.expl.spec] の段落 2 によると:

「明示的な特殊化は、対応するプライマリ テンプレートが定義される任意のスコープで宣言できます。」

この標準からの逸脱は、GCC の潜在的なバグとなります。この問題を報告するには、次の手順に従ってください:

  1. GCC バグ トラッカー Web サイトにアクセスします: https://gcc.gnu.org/bugzilla/
  2. [Create New Report] をクリックします。
  3. [新しいレポートの送信] メニューから [バグ担当者] を選択します
  4. コード スニペット、エラー メッセージ、関連する C 標準セクションへの参照など、問題を明確に説明します ([temp .expl.spec]).
  5. レポートを送信し、使用されている GCC バージョンやコンパイラ オプションなどの関連情報を提供してください。

この問題を報告することで、貢献できます。 GCC の改善に取り組み、GCC が C 標準に完全に準拠していることを確認します。

以上がGCC が名前空間外での明示的な特殊化を拒否するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート