ホームページ >バックエンド開発 >C++ >C 11 SFINAE における「即時コンテキスト」とは何ですか?

C 11 SFINAE における「即時コンテキスト」とは何ですか?

DDD
DDDオリジナル
2024-12-12 20:17:11176ブラウズ

What Defines

C 11 SFINAE の即時コンテキスト

C 11 標準では、条件付きで有効にする手法として SFINAE (置換失敗はエラーではない) が定義されています。または、テンプレート引数の推論に基づいてコードを無効にします。セクション 14.8.2/8 では、置換失敗により SFINAE につながる「ハード」コンパイル エラーまたは「ソフト」エラーが発生する条件について概説しています。

このセクションでは、標準では「即時コンテキスト」について言及しています。これは、関数型とそのテンプレート パラメーター型の直接のコンテキストにある無効な型と式のみが演繹失敗の原因となる可能性があることを示しています。ただし、「即時コンテキスト」の定義は明示的ではありません。

即時コンテキストの決定手順

即時コンテキストで置換エラーが発生するかどうかを判断するには、以下:

テンプレート引数の置換に必要なすべてのテンプレートと暗黙的に定義された関数が生成されると想像してください。事前に。この準備中に発生するエラーは直接的なコンテキストではなく、ハード コンパイル エラーになります。

準備ステップが正常に完了すると、その後の置換中のエラー (インスタンス化されたテンプレートや暗黙的に定義された関数の参照など)関数テンプレートの署名内) はエラーにはなりませんが、減点の対象になります

  • 例 1:

    template<typename T>
    void func(typename T::type* arg);
    
    template<typename>
    void func(...);
    
    template<typename T>
    struct A { typedef T* type; };
    
    func<A<int&>>(...);

    この例では、インスタンス化A;参照へのポインターが許可されていないため、準備中に失敗します。このエラーは置換前に発生するため、ハード コンパイル エラーが発生します。

  • 例 2:

    template<typename T>
    void func(typename T::type* arg);
    
    template<typename>
    void func(...);
    
    template<typename T>
    struct A { typedef T* type; };
    
    template<>
    struct A<char> {};
    
    func<A<char>>(...);

    この例では、準備ステップで A が正常にインスタンス化されました。置換中、A::type は存在しませんが、このエラーは準備段階の後に発生し、引数の推論の失敗とフォールバック関数の使用につながるだけです。

以上がC 11 SFINAE における「即時コンテキスト」とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。