gpt4 book ai didi

c++ - Clang 不编译代码,但 gcc 和 msvc 编译了它

转载 作者:行者123 更新时间:2023-12-01 09:19:53 27 4
gpt4 key购买 nike

我不明白有什么问题:无论是在我的代码中还是在编译器中(不太可能)。有一段代码是这样的:

#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> >'`

我很感兴趣 - 也许标准的某些部分这段代码不正确,或者其他地方。

最佳答案

这很可能与CWG 1558有关.

The treatment of unused arguments in an alias template specialization is not specified by the current wording of 17.6.7 [temp.alias]. For example:

  #include <iostream>

template <class T, class...>
using first_of = T;

template <class T>
first_of<void, typename T::type> f(int)
{ std::cout << "1\n"; }

template <class T>
void f(...)
{ std::cout << "2\n"; }

struct X { typedef void type; };

int main() {
f<X>(0);
f<int>(0);
}

Is the reference to first_of with T being int equivalent to simply void, or is it a substitution failure?



这是一个已被解决的缺陷,但如果您使用的 Clang 版本尚未实现修复,它可能仍然认为这两个特化只是将第二个参数定义为 void ,而不是做整个替换失败的演讲。解决方法是不使用普通别名 std::void_t ,而是一个稍微复杂的版本
template <typename...> struct voider { using type = void; };
template <typename... T> using my_void_t = typename voider<T...>::type;

对于类模板(即别名现在所代表的含义),定义了替换失败。将其插入到您的示例中可以安抚 Clang https://godbolt.org/z/VnkwsM .

关于c++ - Clang 不编译代码,但 gcc 和 msvc 编译了它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60303240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com