Tôi không hiểu vấn đề là gì: trong mã của tôi hoặc trong trình biên dịch (ít có thể hơn). Có một đoạn mã như thế này:
#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;
}
Cả GCC và MSVC đều biên dịch nó. Tôi đã thử nghiệm nó trên godbolt với phiên bản khác nhau của GCC và MSVC 17 (cục bộ) và 19. Đây là một liên kết: https://godbolt.org/z/Enfm6L .
Nhưng Clang không biên dịch nó và phát ra lỗi:
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
Và tôi quan tâm - có thể có một phần của tiêu chuẩn nơi đoạn mã này không chính xác hoặc có thể là thứ gì đó khác.