【发布时间】:2020-06-03 19:02:12
【问题描述】:
我不明白问题出在哪里:无论是在我的代码中还是在编译器中(不太可能)。有一段代码是这样的:
#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::set::reverse_iterator" 和 "std::set::dummy_iterator" 在 clang 头文件中是如何定义的?跨度>
-
std::set::dummy_iterator 根本没有在 clang 头文件中定义(我希望)。您可以将 dummy_iterator 更改为您想要的任何内容,它不会改变结果,因为问题不在定义中,如下所示。
-
谢谢安德烈,我看了答案,确实很有趣
标签: c++ templates gcc visual-c++ clang