具有常量/非常量指针类型的模板的自动类型转换

Automatic type conversion for templates with const/non-const pointer types

本文关键字:常量 类型转换 类型 非常 指针      更新时间:2023-10-16

是否可以为使用常量和非常量指针类型实例化的模板类提供自动转换?

具体来说,考虑以下内容:

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。如果将T替换为int,则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;编译,但您必须非常小心,这些转换实际上做了它们应该做的事情(上面的例子错误地(?)允许intconst int *转换,因为如果给定的类型不是指针,remove_pointer什么都不做,需要enable_if+is_pointer,这会很快变得复杂)。