c++ const和not-const指针的类模板部分专用化

vohkndzv  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(90)

我试图用指针类型的非类型模板参数来创建一个类模板,它有两个针对const和not-const指针的专门化。
这是我最好的尝试,被Clang和GCC接受:

template <const int*>
struct A {};

template <int* p>
struct A<p>;

int v;
A<&v> a;

字符串
但是A<&v>仍然使用带有const指针的主模板,尽管&v的类型是int*
另一方面,MSVC打印:

error C2753: 'A<p>': partial specialization cannot match argument list for primary template


在线演示:https://godbolt.org/z/EzoYoxEza
我的部分特化正确吗?如果正确,我如何使用A<int*>

3phpmpom

3phpmpom1#

如前所述,这是一个MSVC bug。在C++20中,有一个相对优雅的解决方法:

template <auto>
struct A;

template <auto p>
  requires std::same_as<decltype(p), const int*>
struct A<p> { };

template <auto p>
  requires std::same_as<decltype(p), int*>
struct A<p> { };

字符串
在这种情况下,MSVC确实正确地选择了const int*int*专门化;请参阅live example at Compiler Explorer
请注意,由于备忘录错误(Bug 113274),此解决方案目前不适用于GCC,因此您可能必须完全求助于其他解决方案。
你也可以使用#ifdef __GNUC__来使用你的原始版本,而不是MSVC,并且只使用这个版本来使用MSVC。这个解决方案绝对令人厌恶和疯狂,但似乎是唯一的方法来保持所有编译器的模板参数列表干净。

c9x0cxw0

c9x0cxw02#

这是MSVC中的一个bug。您可以使用以下解决方法来编译它而不会出错:

template <typename T, T>
struct A {};

template <int* p>
struct A<int*, p> {};

template <const int* p>
struct A<const int*, p> {};

int v;
A<int*, &v> a;
A<const int*, &v> b;

字符串
有关此错误的更多信息,请访问:Non type template parameter in msvc does not compile

相关问题