関数定義で「enable_if_t」が失敗するのはなぜですか?

DDD
リリース: 2024-11-18 03:21:02
オリジナル
263 人が閲覧しました

Why Does `enable_if_t` Fail in Function Definitions?

テンプレート引数の衝突: 定義でenable_if_t が失敗する理由

テンプレート プログラミングでは、条件付きで有効にする必要がある状況に遭遇することは珍しくありません。または、特定の条件に基づいてテンプレート機能を無効にします。このような場合、これを実現するために std::enable_if テンプレートがよく使用されます。ただし、std::enable_if_t の新しい構文を採用しようとした最近の試みにより、予期しないエラーが発生しました。

以下のコード スニペットでは、std::enable_if:

を使用して 2 つのテンプレート関数 f() を定義しています。
template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
ログイン後にコピー

新しい std::enable_if_t 構文を使用するためにこのコードを移植すると、次のような問題が発生します。問題:

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
ログイン後にコピー

GCC が次のエラーを報告します:

error: redefinition of 'template<class T, class> void g()'
       void g() { }
ログイン後にコピー

このエラーが発生する理由を理解するには、テンプレート引数の構文を調べる必要があります。不要なコードを削除すると、関数は次のように簡略化されて表現されます:

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<int, T>::value>*/
>
void g() { }

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<double, T>::value>*/
>
void g() { }
ログイン後にコピー

デフォルト値の違いに関係なく、両方のテンプレートが同じ型 templatevoid() であることが明らかになります。 2 番目の型引数の場合。これは、同じテンプレート型の 2 つのテンプレート関数が異なるシグネチャを持つ必要があるという C の要件と矛盾します。

この問題を解決するには、2 番目の引数を依存型を持つポインター型に変更できます。

template<
  class T,
  std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr
>
void f() { }

template<
  class T,
  std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr
>
void f() { }
ログイン後にコピー

この変更されたコードでは、テンプレート関数のシグネチャが一意になり、競合が解消され、正しいテンプレート マッチングが可能になります。

以上が関数定義で「enable_if_t」が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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