具有常量/非常量指针类型的模板的自动类型转换
Automatic type conversion for templates with const/non-const pointer types
是否可以为使用常量和非常量指针类型实例化的模板类提供自动转换?
具体来说,考虑以下内容:
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;
编译,但您必须非常小心,这些转换实际上做了它们应该做的事情(上面的例子错误地(?)允许int
到const int *
转换,因为如果给定的类型不是指针,remove_pointer
什么都不做,需要enable_if
+is_pointer
,这会很快变得复杂)。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 如何为具有常量类型的函数正确转换来自 DLsym 的返回值?
- 另一个:从"常量类型*"到"类型*"的转换无效
- 字符串常量之前的预期构造函数、析构函数或类型转换
- C++大小写中的类型转换常量字符串
- 具有常量/非常量指针类型的模板的自动类型转换
- C++中的部分常量类型转换
- 将常量字符* 类型转换为 int 数组
- 为什么将整数文本类型转换为指针值会导致非常量表达式
- 转换为常量类型,初始化数组
- 算术中的c++常量类型转换
- 如何在C++中启用从常量到常量的隐式类型转换