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

标签 c++ templates c++11 clang

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

关于c++ - 具有常量/非常量指针类型的模板的自动类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36992245/

相关文章:

C++ "group where"算法

c++ - 尽管测试成功,但 CppUnit 测试核心已转储。为什么?

java - 获取网站的端口号

c++ - Tandy 1000 PC SX 的 C 或 C++ 编译器?

javascript - 向从模板标签克隆的元素添加事件监听器

c++ - 如何在完整的专用模板类定义之外定义模板成员函数?

c++ - 为什么内存函数的默认模板参数应该明确定义为非法?

c++ - 使用折叠表达式打印所有带有换行符的可变参数

java - Eclipse Java 编辑器模板...为什么没有类型变量?

arrays - 如何获取unique_ptr中存储的数组大小?