何が問題なのか理解できません。コードまたはコンパイラ(可能性が低い)のどちらかです。次のようなコードがあります。
#include <iostream>
#include <type_traits>
#include <set>
template<typename T, typename = void>
struct TestA: std::false_type {};
template<typename T>
struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {};
template<typename T>
struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {};
int main()
{
std::cout << TestA<std::set<int>>::value;
}
GCCとMSVCの両方でコンパイルします。GCCとMSVC 17(ローカル)および19の異なるバージョンを使用して、godboltでテストしました。リンクは次のとおりです:https ://godbolt.org/z/Enfm6L 。
しかし、Clangはそれをコンパイルせず、エラーを出します。
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
そして、私は興味があります-おそらく、このコードの一部が正しくない、またはおそらく何か他の標準の一部があるでしょう。
どのようにしている「のstd ::セット:: reverse_iterator」と「のstd ::設定:: dummy_iterator」打ち鳴らすヘッダで定義されていますか?
—
mvidelgauz
std :: set :: dummy_iteratorはclangヘッダーでまったく定義されていません(私は期待しています)。以下のように問題が定義に含まれていないため、dummy_iteratorは任意の値に変更でき、結果は変更されません。
—
Andrei
Andreiに感謝します、私は答えを読みました、そしてそれは確かに興味深いです
—
mvidelgauz