Ian*_*Ian 5 c++ templates clang c++11
是否可以为使用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;
}
Run Code Online (Sandbox Code Playgroud)
是否可以为具有指针模板参数的类型提供显式转换?这个在A的定义中会是什么样子?
作为奖金/背景问题,为什么上述工作适用于非指针模板参数,而不适用于指针模板参数?
混乱的根源在于指针的常量与被指针的常量。您现在的设置将 a 转换T为const T. 如果你替换它int有效T,int就会变成const int. 然而,如果你替换int *你会得到int * const,而不是const int *。得到Ta const,它是一个指针,因此指针变成const,而不是指向的对象。
以下代码有效:
A<int*const> a5;
A<int*> a6;
// compiles
a5 = a6;
Run Code Online (Sandbox Code Playgroud)
你可以做一些棘手的事情,比如
operator A<std::add_pointer_t<std::add_const_t<std::remove_pointer_t<T>>>>()
{
return {};
}
Run Code Online (Sandbox Code Playgroud)
进行a3 = a4;编译,但你必须非常小心,这些转换实际上做了它们应该做的事情(上面的例子不正确(?)允许int转换const int *,因为remove_pointer如果给定类型不是指针,则不会执行任何操作,需要enable_if+ is_pointerwhich很快就会变得复杂)。