是否可以为使用 const 和非 const 指针类型实例化的模板类提供自动转换?
具体来说,考虑以下几点:
template <typename T>
class A {
public:
operator A<const T>()
{
return A<const T>();
}
};
int main()
{
A<const int> a1;
A<int> a2;
// Works fine; invokes operator A<const T>()
a1 = a2;
A<const int*> a3;
A<int*> a4;
// Fails to compile: no viable overloaded '='
a3 = a4;
return 0;
}
是否可以为带有指针模板参数的类型提供显式转换?这在 A 的定义中会是什么样子?
作为奖励/背景问题,为什么上面的方法适用于非指针模板参数,但不适用于指针模板参数?
最佳答案
混淆的根源是指针的常量与指针对象的常量。您现在的设置将 T
转换为 const T
。如果将 int
替换为 T
它会起作用,int
会变成 const int
。但是,如果您替换 int *
,您将得到 int * const
,而不是 const int *
。 T
得到一个const
,它是一个指针,所以指针变成了const
,而不是指向的对象。
以下代码有效:
A<int*const> a5;
A<int*> a6;
// compiles
a5 = a6;
你可以做一些棘手的事情,比如
operator A<std::add_pointer_t<std::add_const_t<std::remove_pointer_t<T>>>>()
{
return {};
}
使 a3 = a4;
编译,但你必须非常小心这些转换实际上做了它们应该做的事情(上面的例子不正确(?)允许 int
到 const int *
转换,因为如果给定类型不是指针,remove_pointer
什么都不做,需要 enable_if
+ is_pointer
会很快变得复杂)。
关于c++ - 具有常量/非常量指针类型的模板的自动类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36992245/