ホームページ >バックエンド開発 >C++ >デフォルト値で `std::enable_if_t` を使用すると再定義エラーが発生するのはなぜですか?

デフォルト値で `std::enable_if_t` を使用すると再定義エラーが発生するのはなぜですか?

DDD
DDDオリジナル
2024-11-12 11:24:02308ブラウズ

Why Does Using `std::enable_if_t` With Default Values Result in a Redefinition Error?

enable_if_t テンプレート引数の再定義の問題

提供されたコードでは、新しい構文を使用して std::enable_if 型制約を変換しようとしています。 (typename = std::enable_if_t...) とすると再定義エラーになります。これは、2 つのテンプレート関数:

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() { }

が両方とも templatevoid() 型であるためです。コンパイラは 2 つのテンプレートが同一であると見なすため、2 番目の型引数に異なるデフォルト値があるという事実は無関係です。

この問題に対処するには、enable_if_t 制約からデフォルト値を削除する必要があります。これにより、次のコードが生成されます。

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

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

この場合、2 番目の型引数はポインターになり、その型は最初の引数に依存します。コンパイラは、型 T を代入して 2 つのテンプレート間に競合があるかどうかを判断し、競合がないことを解決します。

以上がデフォルト値で `std::enable_if_t` を使用すると再定義エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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